我想使用泛型在Java中返回不同的类类型,但是有一个错误。
这些返回值具有唯一的字段,因此我不想将其父类用作返回类型。
这是代码:
public class Client {
public static void main(String[] args) {
Client c = new Client();
A a = c.gets(1);
System.out.println(a.aFiled);
B b = c.gets(2);
System.out.println(b.bFiled);
}
public <T extends Root> T gets(int type) {
switch (type) {
case 1:
return new A();
case 2:
return new B();
default:
throw new RuntimeException();
}
}
class Root {
String name;
}
class A extends Root {
int aFiled;
}
class B extends Root {
int bFiled;
}
}
错误发生在内部 switch
“不兼容的类型”
必需:T
找到的:Client.A
我的意思是返回someclass扩展Root
,我不知道为什么它是错误的。
如果有人可以向我解释,我将不胜感激。
在通用方法中,类型由编译器使用实际参数来推断。但是您的参数没有任何类型T。您可以发送另一个参数Class<T>
来告诉返回值的类型:
public <T extends Root> T gets(int type, Class<T> c) {
switch (type) {
case 1:
return c.cast(new A());
case 2:
return c.cast(new B());
default:
throw new RuntimeException();
}
}
但是在您的情况下,在调用此方法之前您不知道类型。
因此,您所能做的就是使此方法变为非泛型并将返回类型更改为just Root
。然后,您可以进行instanceof
检查以识别类,执行强制转换,然后获取相关字段。
无论如何,使该方法通用是没有意义的,因为通用方法可以与提供的不同类型的数据一起使用。但对于您而言,它始终是int
。所以我想说您的方法不是真正的通用方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句