首页 > 解决方案 > 为什么传递原始类型不会给我错误?

问题描述

当我遇到这一段时,我正在从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; }
}

因为它的方法接受或返回一个对象,所以你可以随意传入任何你想要的东西,只要它不是原始类型之一。在编译时无法验证类的使用方式。一部分代码可能会在框中放置一个 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());
    }
}

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

这是由于自动装箱吗?如果是这样,那么使用泛型的重要性会降低吗?

谢谢

标签: javagenerics

解决方案


这里确实有自动装箱:

int i = 5;
box2.set(i);

set期望 anObject而你给它一个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!

推荐阅读