我必须实现一个方法,我有一个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>
有人可以告诉我为什么我们不能将子类型对象返回到通用超类,为什么没有任何警告可以自由地进行呢?
答案 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问题。你真正想解决的问题是什么?因为您开始使用的解决方案无效。