2016-07-19 68 views
-1

我有一个接口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,有什么不对的代码?

+0

“它的作品”,因为它是多余的:你不需要为自己投射一种类型。 –

+0

“编译错误”,因为'T'并不总是'Cls1';它*可能*是'Cls1',但它也可能是它的一个子类。 –

+1

当方法签名中没有使用“T”时,使方法具有通用性(添加'')。 – Andreas

回答

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中,由子类和超类参数化的类是不相关的。您需要先投入<?>。总的来说,如果我上面的代码正确反映了你的代码,这是一个非常奇怪的泛型使用。请确保您的设计是正确的。

+0

我没有显示我的完整用例,但这是因为方法的返回值是由'T'键入的,也是一个参数。在这个方法的某个地方,我获得了一个类型为“T”子类型的对象。我不明白为什么它返回它是无效的......有没有办法做到这一点没有警告,并没有压制警告? – FBB

相关问题