2016-07-20 13 views
-3

ジェネリックスのJavaではプリミティブのオートボクシングとアンボクシングが行われないのはなぜですか?プリミティブのオートボクシングとアンボクシングを伴うジェネリック

public static <T extends Number> T addNumber(T a , T b) 
{ 
    int c = a*b; 
    System.out.println(c); 
    return c; 
} 

ここでは*操作が実行できないため、なぜc.Anyヘルプを返すことができないのかが分かります。 TIntegerで囲まれているので

答えて

0
int c = a*b; 

この文は、実際には、動作しますので、消去した後、abの種類はIntegerであり、彼らはintへアンボクシングされています。

return c; 

メソッドの戻り値の型がIntegerではありませんので、これは動作しません、それはTあり、かつ<T extends Integer>Integerは、コンパイラがそれを許可していませんので、TのみIntegerすることができ、finalであるにもかかわらず、それは、型バインドのfinalityを考慮していないので(つまり、関連する型のサブクラスのインスタンスを受け入れることができます)、サブクラスにはintをオートボックスできません結合された型のクラス) Integerに戻り値の型を変更する

は、コードパスのコンパイルになります。もちろん

public static <T extends Integer> Integer addNumber(T a , T b){ 
    int c = a*b; 
    System.out.println(c); 
    return c; 
} 

を、それが一般的なタイプにバインドタイプとしてInteger(または任意の最終クラス)を使用しても意味がありません。パラメータ。

+0

それも、int型のC = * bに機能していません。 – Pooja

+0

@Poojaそれは私のためです。私はちょうどそれを試みた。 – Eran

+0

が許可されていない場合は* b – Pooja

1

ジェネリックはプリミティブ型では使用されていません。 Tは、オブジェクトでなければならない型パラメータを示す。
より参照
Why don't Java Generics support primitive types? Java Generics ? , E and T what is the difference?
Restrictions on generics

+0

Integerはラッパークラスでもあり、そのオブジェクトに対して数学演算を実行すると許可されます。なぜTがIntegerを拡張するのではないでしょうか – Pooja

+0

@pooja https://docs.oracle.com/javase/tutorial/ java/generics/restrictions.html –

関連する問題