Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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泛型问题_Java_Generics - Fatal编程技术网

Java泛型问题

Java泛型问题,java,generics,Java,Generics,我遵循这个类的定义 public class Test2<T extends Test3> { private T t ; public T foo() { Test3 test3 = new Test3(); t = test3; // I get compilation error here.** return t; } } class Test3 { } 公共类Test2{ 私人

我遵循这个类的定义

public class Test2<T extends Test3> {

     private T t ;


     public T foo() {
         Test3 test3 = new Test3();
         t = test3;  // I get compilation error here.**
         return t;
     }

}

class Test3 {

}
公共类Test2{
私人T;
公共图书馆{
Test3 Test3=新的Test3();
t=test3;//我在这里得到编译错误**
返回t;
}
}
类Test3{
}
我在t=test3行得到编译错误,表示“类型不匹配不能从test3转换为t;
出了什么问题?

您所做的与此等效:

Integer n = new Number();
与泛型无关(请注意,
Integer扩展了Number
)。编译器指示您无法将父类型分配给子类型的实例,父类型可能无法实现子类型所需的所有方法


在本例中,
T
Test3
的子类型,或
Test3
本身。因此,在这里,您试图将父类(
T
)分配给包含子类(
Test3
)的变量它失败了,就像上面的例子一样。

T
Test3
的一个子类。因此,除非它确实是
Test3
,否则赋值将失败,因为可以将子类分配给超类类型的变量,但反之则不正确。

因为它是向下转换的。T可以是从Test3派生的任何类,如果您是ure(但为什么需要T,请使用always Test3)您可以使用以下显式转换:

@SuppressWarnings("unchecked")
t = (T)test3;

子对象变量能否引用父对象

只需在没有泛型的情况下进行测试:

public class Foo {

    public static void main(String args[]) {
        T t = new Test3();
    }
}

class T extends Test3 {
}

class Test3 {
}

编辑:没关系,我最初是作为注释发布的,然后作为答案发布的……但为时已晚!:)

子对象变量可以引用父对象吗?@Hovercraft:不,它不能,这正是问题所在(请参见我的答案)。我知道那个标记,我想让OP理解它,但我是作为注释而不是答案发布的(@Hovercraft-+1感谢您在这里尝试使用苏格拉底式教学方法,并得到另一张海报的回答。这让我发笑。我想返回Test3的实例。没有泛型的书写方法是唯一的解决方案吗?如果我像下面这样施法,它会看起来很难看。@SuppressWarnings(“unchecked”)t=(t)Test3;