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