无法将子类对象返回到Java中的泛型超类返回类型

时间:2015-05-07 10:50:26

标签: java generics inheritance

我必须实现一个方法,我有一个SuperClass(通用)作为返回类型,我必须返回一个特定的子类(不是通用的)Object。 我的方法签名是

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

编译器抱怨因为无法将子类转换为SuperClass;

如果我将它强制转换为SuperClass,它会向我发出警告,因为Uncheckedcast从子类到SuperClass

我尝试的另一种方法是

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>

有人可以告诉我为什么我们不能将子类型对象返回到通用超类,为什么没有任何警告可以自由地进行呢?

1 个答案:

答案 0 :(得分: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>,这是<VirtualHost *:80> ProxyPreserveHost On ProxyRequests Off ServerName mydomain.com ServerAlias www.mydomain.com ProxyPass / http://0.0.0.0:3000/ ProxyPassReverse / http://0.0.0.0:3000/ </VirtualHost> 不同。想要使用此代码是完全错误的。

我怀疑你这里有XY问题。你真正想解决的问题是什么?因为您开始使用的解决方案无效。