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

标签 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; }
}

由于它的方法接受或返回一个对象,因此您可以自由地传递任何您想要的内容,只要它不是原始类型之一。无法在编译时验证该类的使用方式。代码的一部分可能会在框中放置一个整数并期望从中取出整数,而代码的另一部分可能会错误地传入一个字符串,从而导致运行时错误。

我运行了以下代码

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 .

但这并不是您没有收到错误的原因。

你引用的段落说的是

One part of the code may place an Integer in the box and expect to get Integers out of it, while another part of the code may mistakenly pass in a String, resulting in a runtime error.

该段落谈论的是同一个盒子!您创建了 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!

关于java - 为什么传递原始类型不会给我错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55510215/

相关文章:

java - Servlet 返回 JSTL 结果或对象列表?

c# - 在 C# 中遍历泛型列表

java - 泛型错误 : not applicable for the arguments

Java 泛型类对象数组实例化

c# - 在 C# 中测试对象是否为泛型类型

java - 我无法创建 JSONObject 的实例

java - 使用 Byte Buddy 添加具有给定值的注释

java - 无法在 Hive 中实例化元数据.SessionHiveMetaStoreClient(Ubuntu 16.04)

java - 在 Selenium-Webdriver 中将 Java 变量与 Sikuli 一起使用

java - 对象类型的隐式声明和显式泛型声明之间的区别