Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Is-a与参数化引用的关系_Java_Generics - Fatal编程技术网

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的内容可能重复了感谢您的回答和链接,所以它提供了非常丰富的信息。不过,我决定接受弗拉德的回答,因为他首先提供了这些信息。谢谢你的回答和链接,内容非常丰富。然而,我决定接受弗拉德的回答,因为他首先提供了这些信息。是的,这些问号以某种方式捕捉到了这种类型。您不能将任何随机的
对象
插入到该
框中是的,这些问号以某种方式捕获了类型。您不能将任何随机
对象
插入该