将子类型转换为定义为泛型的类型

时间:2016-07-19 17:42:13

标签: java generics

我有一个界面Int1。我有一个实施Cls1的课程Int1。和通用类Cls2<Cls1>

现在我正在写一个方法:

private void <T extends Int1> test(Cls2<Cls1> arg1) {
    ...
    //I try to cast a Cls2<Cls1> into a Cls2<Int1>: it works
    Cls2<Int1> test1 = (Cls2<Int1>) arg1;
    //I try to cast a Cls2<Cls1> into a Cls2<T>: doesn't work
    Cls2<T> test2 = (Cls2<T>) arg1; //compilation error
}

考虑到T扩展Int1,此代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

下面的代码在intellij中编译w / o错误。

interface Int1{}
class Cls2<T>{}
class Cls1 implements Int1 {}


private <T extends Int1> void test(Cls2<Cls1> arg1) {
    Cls2<Int1> test1 = (Cls2<Int1>)(Cls2<?>)arg1;
    Cls2<T> test2 = (Cls2<T>) arg1;
}

在java中,由子类和超类参数化的类不相关。您需要先转换为<?>

总的来说,如果我上面的内容正确地反映了你的代码,那么泛型的使用就非常奇怪了。请确保您的设计正确。