遇到此段时,我正在从https://docs.oracle.com/javase/tutorial/java/generics/阅读Java文档:-
简单盒子类 首先检查对任何类型的对象进行操作的非通用Box类。它只需要提供两种方法:set(将对象添加到框中)和get(将其检索到):
public class Box {
private Object object;
public void set(Object object) { this.object = object; }
public Object get() { return object; }
}
由于它的方法接受或返回一个Object,因此只要它不是原始类型之一,就可以随意传递任何所需的对象。在编译时无法验证类的使用方式。代码的一部分可能会将Integer放在框中,并期望从中取出Integer,而代码的另一部分可能会错误地传入String,从而导致运行时错误。
我运行了以下代码
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());
}
}
但是它没有给出任何运行时错误。
这是由于自动装箱吗?如果是这样的话,那么使用泛型的重要性就更少了?
谢谢
答案 0 :(得分:5)
这里确实有自动装箱:
int i = 5;
box2.set(i);
set
需要一个Object
,而您给它一个int
,因此将其装箱到Integer
。
但这不是您没有收到错误的原因。
您引用的段落说
代码的一部分可能会将Integer放入框中,并期望从中取出Integer,而代码的另一部分可能会错误地传入String,从而导致运行时错误。
该段谈论的是相同框!您已经创建了2个不同的框,在其中分别放置了Integer
和另一个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!