java - 为什么传递原始类型不会给我错误?
问题描述
当我遇到这一段时,我正在从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());
}
}
但它没有给出任何运行时错误。
这是由于自动装箱吗?如果是这样,那么使用泛型的重要性会降低吗?
谢谢
解决方案
这里确实有自动装箱:
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!
推荐阅读
- c# - 如何在 ASP.NET MVC 5 中访问 AspNetUserRoles 表
- c# - 如何在极少数情况下避免异常设置 Window.TaskbarItemInfo
- node.js - 通过 http 下载并使用 nodejs 流式上传到谷歌云存储
- java - Appium 错误:线程“主”org.openqa.selenium.SessionNotCreatedException 中的异常:无法创建新的远程会话
- python - 使用逗号和小数打印大数字的区域感知方法
- c++ - 在 C++ 类中创建嵌套的自定义 QML 组件“组件”
- python-3.x - TKINTER:如何从列表框中删除项目/将项目添加到列表框中
- sql - 从 1 个表中选择条件在另一个表中的情况?
- javascript - 如何阻止我的 JavaScript 给出
- javascript - 当我尝试将电子商务应用程序上传到 Heroku 时出现 redux 记录器错误