为什么传递原始类型不会给我错误?

时间:2019-04-04 07:33:01

标签: java generics

遇到此段时,我正在从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());
    }
}

但是它没有给出任何运行时错误。

这是由于自动装箱吗?如果是这样的话,那么使用泛型的重要性就更少了?

谢谢

1 个答案:

答案 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!