ジェネリックスに関するOracleのチュートリアルを読んでいて、提供されているサンプルで何が間違っているかわかりませんでした。チュートリアルを引用Oracle Javaジェネリックチュートリアルボックスクラスの説明
(チュートリアルではhttps://docs.oracle.com/javase/tutorial/java/generics/types.html @見つけることができます):
は、任意のタイプのオブジェクトで動作する非ジェネリックBoxクラスを調べることから始めます。それを取得した、セット、ボックスにオブジェクトを追加し、取得:それは唯一の2つのメソッドを提供する必要が
public class Box { private Object object; public void set(Object object) { this.object = object; } public Object get() { return object; } }
その方法は
Object
を受け入れるか返すので、あなたが好きに合格するのは自由ですただし、それは基本型の1つではありません。クラスの使用方法をコンパイル時に検証する方法はありません。コードの別の部分が誤って実行時エラーが生じ、String
を渡すかもしれないが、コードの一部は、ボックス内の整数を配置し、それから整数を得ることを期待する。」私がしようとした
なぜそのランタイムエラーがそのような操作の結果であるのか解明できないので、私は自分のIDEで状況を再現し、コードを実行しましたが、エラーは発生しませんでした 私は間違っていますか? ?状況はここで
は、私は状況をテストするために作成したサンプルコードです:
Boxクラスの定義
public class Box
{
private Object ob;
public Object getObject(){
return ob;
}
public void setObject(Object ob){
this.ob = ob;
}
}
テストBoxクラス
public class BoxTest
{
public static void run(){
String sPar = "hello";
Integer iPar = 45;
Box box = new Box();
box.setObject(iPar);
System.out.println(box.getObject());
box.setObject(sPar);
System.out.println(box.getObject());
}
}
私はまた、プリミティブ型に渡そうとしましたし、それはまだ正常に動作...なぜランタイムエラーがこのような状況で発生するのでしょうか?
あなたが別の型に戻り値をキャストしようとすると、ランタイム例外が発生します。 – Savior
汎用クラスはプリミティブではなく参照型を要求します。 – Logan
@Pillarおかげで、それは私が...私は、「これまで明確から」チュートリアルの説明 –