我正在阅读有关通用类型的oracles教程,第一段真的让我很头疼。该页面位于https://docs.oracle.com/javase/tutorial/java/generics/types.html。该教程以名为“ Box”的类开始:
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,从而导致运行时错误。
最后一句话对我来说绝对没有意义,而且我已经阅读了该特定页面的其余部分,但仍然无法确切知道他们要说的是什么,感觉就像我错过了课程的很大一部分。将某些东西“放置”在盒子里是什么意思?
我已经尝试了一切,我尝试以一千种不同的方式实例化Box类以使其有意义,它们都导致编译时错误而不是运行时错误。无论我从哪个角度看,我都无法理解这一点,难以理解这意味着什么
由于我们处于Box类的上下文中-一个类是物理盒子的抽象-将整数“放入”盒子只是说“将object字段设置为”的一种抽象方式Integer。
至于你的评论:
似乎首先他们在说我可以通过任何事情,然后他们在说我不能通过
这就是最后一句话的意思:您可能具有以下代码:
Box b = new Box();
b.set(1); // I've put an integer into the box, I should be able to get integers out of it later on
...
Integer i = (Integer)b.get();
Run Code Online (Sandbox Code Playgroud)
本教程所指的“代码的另一部分”是“ ...”部分。如果“ ...”实际上有这样的一行:
b.set("String"); // I forgot that I'm supposed to only put Integers in the box
Run Code Online (Sandbox Code Playgroud)
然后,最后一行将引发异常。
泛型通过使b.setObject("String");问题类似编译器错误来解决此问题。