2015-05-07 84 views
0

我必须实现一个将SuperClass(泛型)作为返回类型的方法,并且必须返回特定的子类(它不是泛型)Object。 我的方法签名是无法将子类对象返回到Java中的泛型超类返回类型

private <A extends ClassA<B>, B> SuperClass<A,B> methodA(){ 
    subclass sc = new subclass(); 
    return sc; 
} 

编译器会为无法转换的子类进行超;

,如果我把它强制转换为超类,它给我的警告作为Uncheckedcast从子类到超

另一种方式我试图这样做是

private <SC extends SuperClass<A,B>, A extends ClassA<B>, B> SC methodA(){ 
    subclass sc = new subclass(); 
    return sc; 
} 

它仍然给了我同样的错误:无法从转换SC的子类。

最后我想这

private <SC extends SuperClass<A,B>, A extends ClassA<B>, B> SC methodA(){ 
    SC sc = (SC)new subclass(); 
    return sc; 
} 

,现在有一个警告选中演员。

我的子类声明

subclass extends SuperClass<ClassC, ClassD> 
where ClassC extends ClassA and ClassD is a concrete type. 

我父声明

class SuperClass<A extends ClassA<B>, B> 

谁能告诉我,为什么我们不能亚型对象返回到一个通用的超为什么会有这样做的没有警告的办法它?

+0

您可以添加Superclass和Subclass(es)的类标题吗? – Tom

+0

ClassC是否延伸ClassA ?如果不是,你打破SubClass中SuperClass的允许范围。 – redge

回答

0

你的代码没有意义。据推测,subclass延伸SuperClass与特定的参数,否则它将是通用的本身。 (或者它可以继承原始版本,这在逻辑上等于两个参数都通过Object)。

这意味着subclass可以安全地转换为SuperClass这些特定参数。将其转换为SuperClass的任何其他版本都是错误的。

编译器告诉你,你的代码是错误的,编译器是正确的。重新思考你的设计。

编辑澄清:

假设我有这样的代码:

public class ClassE {} 
public class ClassF extends ClassA<ClassE> {} 

SuperClass<ClassF, ClassE> sc = someobject.<ClassF, ClassE>methodA(); 

现在,这个代码将编译,因为它有正确的类型。但是如果你的代码没有产生错误或警告,那么sc现在将指向subclass,其不延伸SuperClass<ClassF, ClassE>,它延伸SuperClass<ClassC, ClassD>,这是不同的。想要这个代码工作是错误的。

我怀疑你在这里有一个XY问题。你究竟想要解决什么问题?因为您开始的解决方案不起作用。

+0

是的,我的子类用A和B的子类扩展了SuperClass。声明为 子类扩展SuperClass 其中C扩展A和D是一个具体类型。 – Neelam