Java 将子类型强制转换为定义为泛型的类型

Java 将子类型强制转换为定义为泛型的类型,java,generics,Java,Generics,我有一个接口Int1。我有一个类Cls1实现Int1。和泛型类Cls2 现在我在写一个方法: 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;

我有一个接口
Int1
。我有一个类
Cls1
实现
Int1
。和泛型类
Cls2

现在我在写一个方法:

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
}
专用无效测试(Cls2 arg1){
...
//我尝试将一个Cls2转换成一个Cls2:它是有效的
Cls2 test1=(Cls2)arg1;
//我试图将一个Cls2转换成一个Cls2:不起作用
Cls2 test2=(Cls2)arg1;//编译错误
}

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

下面的代码编译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;
}
接口Int1{}
类Cls2{}
类Cls1实现Int1{}
专用无效测试(Cls2 arg1){
Cls2测试1=(Cls2)(Cls2)arg1;
Cls2测试2=(Cls2)arg1;
}
在java中,由子类和超类参数化的类是不相关的。您需要先强制转换为


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

“它工作”是因为它是冗余的:您不需要将类型强制转换为自身。“编译错误”是因为
t
并不总是
Cls1
;它可能是
Cls1
,但也可能是它的一个子类。当
T
未在方法签名中使用时,使方法通用(添加
)有什么意义。我想你是反其道而行之。第一行应该是编译错误,第二行应该编译良好(带有警告)。我没有显示我的完整用例,但这是因为该方法的返回值是由
t
键入的,以及其中一个参数键入的。在这个方法的某个地方,我得到了一个类型为
T
的对象。我不明白为什么退货是无效的。。。有没有办法在没有警告和不抑制警告的情况下执行此操作?