[英]Generics + optional parameter in Java can't be combined
我正在寻找以下问题的优雅解决方案:
//one interface
public interface MyInterface () {
}
//two implementations
public class ImplA implements MyInterface (){
}
public class ImplB implements MyInterface () {
}
在另一个班级:
//one generic method
public void myMethod(Class<MyInterface>... myTypes) {
for (Class<MyInterface> myType : myTypes) {
System.err.println("my Type:" +myType);
}
}
问题是您不能简单地使用以下方法调用此方法:
myMethod(ImplA.class, ImplB.class);
这根本就不被接受。 是否可以组合可选参数和泛型? 我找不到任何例子。
我会尝试
public void myMethod(Class<? extends MyInterface>... myTypes) {
Class<MyInterface>
必须是MyInterface.class
而不是子类。
用? extends
? extends
通配符以使其工作。
public void myMethod(Class<? extends MyInterface>... myTypes) {
for (Class<? extends MyInterface> myType : myTypes) {
System.err.println("my Type:" +myType);
}
}
您最初的方式要求每个实现者的引用类型是MyInterface
。 随着我的建议的方式,你都不允许有你的介绍人是MyInterface
或任何子女(孙子,等) MyInterface
。
您必须使参数类型为covariant(定义上限)。 只有一种类型具有签名Class<X>
,即X.class
。 子类型是Class<? extends X>
Class<? extends X>
。 所以:
@SafeVarargs
public void myMethod(Class<? extends MyInterface>... myTypes) {
// do stuff
}
你可以尝试这样的事情:
public void myMethod(Class<? extends MyInterface>... myTypes) {
for (Class<?> myType : myTypes) {
System.err.println("my Type:" +myType);
}
}
你应该使用有界通配符来声明你的泛型类型 - Class<? extends MyInterface>
Class<? extends MyInterface>
public void myMethod(Class<? extends MyInterface>... myTypes) {
for (Class<? extends MyInterface> myType : myTypes) {
System.err.println("my Type:" +myType);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.