Java GenericsチュートリアルとGenericsを扱うStackoverflowのスレッドはほとんど読んでいませんでしたが、それでも特定のケースを理解できませんでした。 はここにある:ここでは Java Generics - 生の型とパラメータ化された型変換
public class Box<T>
{
private T t;
public T getT()
{
return t;
}
public void setT (T t)
{
this.t = t;
}
public static void main (String[] args)
{
Box<Integer> intBox = new Box<Integer>();
Box rawBox = intBox;
rawBox.setT("NBA");
System.out.println(rawBox.getT());
System.out.println(intBox.getT());
/*1*/ //System.out.println(intBox.getT().toString());
}
}
が契約、私は理解して最初の印刷、つまりだ、
System.out.println(rawBox.getT());
プリントNBA、rawBoxはボックスTの生タイプのものであり、それが私たち「を与える」ため、オブジェクト。
System.out.println(intBox.getT());
NBAを印刷します:私は得ることはありません何
は、第二の印刷です。 intBoxはジェネリック型(この場合はBox of Integers)です。つまり、getterメソッドはT型の値(この場合はInteger)を返さなければなりません。 (これはBox Tに与えられた引数型であるため)Integerに変換され、実行時にClassCastExceptionを発生させる必要がありますが、それは起こりません。私はそれをアンコメントしていたならば、それはClassCastExceptionが原因だろうから仕方、コメント数で
は/ /(文字列が整数にキャストすることはできません)ruuntimeで飼育されるように、混乱を追加し、私は「ドンそのことを理解してくださいありがとうございます。
最初に、すばらしい答え、 Object型の引数を受け入れるprintlnメソッドを理解しました。 これは、printlnメソッドを呼び出さないと、次のステートメントを呼び出さない理由を説明していません。 intBox.getT(); ClassCastExceptionを発生させません:StringはIntegerにキャストできません。 その文はコンパイルされて正常に動作します。 intBoxがパラメータ化された型(Integer)の場合、そのgetterメソッドはIntegerを返し、StringからIntegerへの変換は であるため、getterメソッド自体から例外が発生するため、発生しません。 – Michael1
@ Michael1:キャストの戻り値の型を強制するのは、ジェネリックメソッドの* caller *までです。インスタンス化された型ごとに別々の '.class'ファイルが生成されていないことを思い出してください。言い換えれば、 'Box.class'には、すべての型に対して動作する必要があるため、' Integer'にキャストを追加する場所がありません。パラメータの* erasure *のみを強制します(この場合、消去は 'Object'です)。次に、必要になったときに発信者がキャストを行う必要があります。 –
[JLS 15.5](https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.5):*静的に既知のタイプが存在しない場合があります実行時に正確です。このような状況は、コンパイル時に未確認の警告を発生させるプログラムで発生する可能性があります。このような警告は、静的に安全であることが保証されていない操作に対応して与えられます。結果として、**プログラムの実行中に後で動的チェックが実行されると、実行時型エラーが発生する可能性があります。**。* –