Java Is-a与参数化引用的关系
以前可能有人问过这个问题,但我一直找不到问题 我想了解以下代码块未编译的根本原因:Java Is-a与参数化引用的关系,java,generics,Java,Generics,以前可能有人问过这个问题,但我一直找不到问题 我想了解以下代码块未编译的根本原因: public class Box<T> { private T value; public Box(T value) { this.value = value; } public T getValue() { return value; } public static void main(String[] args
public class Box<T> {
private T value;
public Box(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public static void main(String[] args) {
Box<Integer> i = new Box<Integer>(13);
// does not compile
Box<Object> o = i;
}
}
公共类框{
私人T值;
公用箱(T值){
这个值=值;
}
公共T getValue(){
返回值;
}
公共静态void main(字符串[]args){
方框i=新方框(13);
//不编译
框o=i;
}
}
首先,不能强制转换参数化类型。看看这个
通常,您不能强制转换为参数化类型,除非
由无界通配符参数化。例如:
List li=new ArrayList()列表ln=(列表)li;//编译时错误 因此,行
框o=i代码>导致编译时错误
即使在创建Box
对象时,您没有指定泛型参数,但使用构造函数参数类型java来创建对象的类型。首先,您不能强制转换参数化类型。看看这个
通常,您不能强制转换为参数化类型,除非
由无界通配符参数化。例如:
List li=new ArrayList()
列表ln=(列表)li;//编译时错误
因此,行框o=i代码>导致编译时错误
即使在创建Box
对象时,您没有指定泛型参数,而是使用构造函数参数类型java作为构造对象的类型。一种方法是,假设Box
定义了一个void setValue(T val)
方法
Box<Object> o = i;
o.setValue("a string");
Integer x = i.getValue(); // ?!
框o=i;
o、 setValue(“字符串”);
整数x=i.getValue();/?!
一种方法是,假设Box
定义了一个void setValue(T val)
方法
Box<Object> o = i;
o.setValue("a string");
Integer x = i.getValue(); // ?!
框o=i;
o、 setValue(“字符串”);
整数x=i.getValue();/?!
您可以将任何引用指定给对象
引用,但当泛型启动时,将在编译时匹配确切的泛型类型。因此它不起作用。如果更改为Box,则可以将任何引用指定给对象
引用,但当泛型启动时,将在编译时匹配确切的泛型类型。因此它不起作用。如果更改为Box,则java文档中会提到这个问题(与Vlad的答案类似):
让我们测试一下您对泛型的理解。以下代码段合法吗
List<String> ls = new ArrayList<String>(); // 1
List<Object> lo = ls; // 2
在这里,我们将ls和lo化名为。通过别名lo访问ls(字符串列表),我们可以在其中插入任意对象。因此,ls不再仅仅是一个字符串,当我们试图从中得到一些东西时,我们会得到一个粗鲁的惊喜
java文档中提到了这个问题(类似于Vlad的回答):
让我们测试一下您对泛型的理解。以下代码段合法吗
List<String> ls = new ArrayList<String>(); // 1
List<Object> lo = ls; // 2
在这里,我们将ls和lo化名为。通过别名lo访问ls(字符串列表),我们可以在其中插入任意对象。因此,ls不再仅仅是一个字符串,当我们试图从中得到一些东西时,我们会得到一个粗鲁的惊喜
所有的整数都是对象,不是所有的对象都是整数。@Stultuske你是对的,但我不认为这是这里的问题…想详细说明一下答案吗?因为整数i=新整数(5);对象o=i;是有效的。泛型有时很奇怪。。。因为像box这样的东西所有整数的可能重复都是对象,不是所有的对象都是整数。@Stultuske你是对的,但我不认为这是这里的问题……想用一个答案详细说明一下吗?因为整数i=新整数(5);对象o=i;是有效的。泛型有时很奇怪。。。因为类似于box的内容可能重复了感谢您的回答和链接,所以它提供了非常丰富的信息。不过,我决定接受弗拉德的回答,因为他首先提供了这些信息。谢谢你的回答和链接,内容非常丰富。然而,我决定接受弗拉德的回答,因为他首先提供了这些信息。是的,这些问号以某种方式捕捉到了这种类型。您不能将任何随机的对象
插入到该框中是的,这些问号以某种方式捕获了类型。您不能将任何随机对象
插入该框