私はからのJavaのマニュアルを読んでいたhttps://docs.oracle.com/javase/tutorial/java/generics/私はこの段落に出くわしたとき: -
シンプルなボックスクラスは、任意のタイプのオブジェクトで動作する非ジェネリックBoxクラスを調べることから始めます。それを取得した、セットボックスにオブジェクトを追加した、と取得:それは唯一の2つのメソッドを提供する必要があります:
public class Box {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
そのメソッドが受け入れるか、またはオブジェクトを返すので、あなたはそれがプリミティブ型の一つではないことを提供し、あなたが好きに合格するのは自由です。クラスがどのように使われるか、コンパイル時、で、検証する方法はありません。コードの別の部分が誤って実行時エラーが生じ、文字列を渡すかもしれないが、コードの一部は、ボックス内の整数を置き、そこから整数を得ることを期待します。
私は、次のコードを実行しました
public class Box {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
。..
public class test {
public static void main(String[] args) {
Box box = new Box();
String s = "hello";
box.set(s);
System.out.print(box.get());
Box box2 = new Box();
int i = 5;
box2.set(i);
System.out.print(box2.get());
}
}
しかし、それはすべてのランタイムエラーを与えていません。
これは、オートボクシングが原因か?それがそうであるならば、そこジェネリック医薬品を使用することの少ない重要です??
ありがとうございました
オートボクシングはここに確かにあります。
int i = 5;
box2.set(i);
set
期待しObject
て、あなたはそれ与えているint
、それが箱入りますので、Integer
。
しかし、それはあなたがエラーを取得していない理由ではありません。
あなたが引用された段落は、と言っています
コードの別の部分が誤って実行時エラーが生じ、文字列を渡すかもしれないが、コードの一部は、ボックス内の整数を置き、そこから整数を得ることを期待します。
その段落は話している同じボックス!あなたは、2つの異なる箱を作成して入れているInteger
1内およびString
その他に。
その段落が言っていることを再作成するには、あなたはこのような何かを行うことができます。
// there is only one box
Box box = new Box();
// one part of your code
box.set(10);
// another part of your code (Imagine box is passed to some other class and you forgot that it actually has an Integer)
String myString = (String)box.get(); // error!