5
私はジェネリッククラスのパーセルとジェネリックメソッドのデリバリーを以下のコードに示しているとします。このメソッドは、メソッド内で型パラメータIntegerが割り当てられたxを出力して返します。パラメータを入力しても役割はありませんか?
public class Parcel<T> {
public <X> X deliver(){
X x = (X) new Integer(100);
System.out.println(x);
return x;
}
}
メインの内部では、タイプパラメータParcelを渡してメソッドdeliverを呼び出します。しかし、まだ100をプリントしています。
これは、print行に渡された型引数Parcelが何の役割も果たさないことを意味し、ここでは例外が予想されます。どのように機能するのですか?
あなたは 'java.lang.Object'にバインドしているためです。 'X'は上限が' java.lang.Object'であると仮定して特定の型に束縛されていないので、 'ClassCastException'はありません。 'deliver'を呼び出し、' java.lang.Object'、 'java.lang.Number'、および' java.lang以外の型を持つ変数/フィールド/パラメータに結果をキャストすると、1つを取得します。整数 'である。また、 'println(Object)'を呼び出すのでコードが失敗することはありません。それを 'parcel 'に変更した場合。 deliver() 'の場合、コンパイラはjava.lang.Integerをjava.lang.Stringにキャストできない' println(String) 'を使用します –
また、' '制約をmoreに変更することができますコンパイラは 'deliver()'メソッドでコンクリート型キャストを使用します。 'X extends String>は' ClassCastException'を返します。 'X'は' java.lang.String'に置き換えられているため、 'X x =(X)(Object)new Integer(100);'ここに。 –