我正在为以下问题寻找优雅的解决方案:
//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);
这只是不被接受。是否可以组合可选参数和泛型?我找不到任何例子。
答案 0 :(得分:2)
我会尝试
public void myMethod(Class<? extends MyInterface>... myTypes) {
Class<MyInterface>
必须是MyInterface.class
而不是子类。
答案 1 :(得分:1)
使用? extends
通配符使其正常工作。
public void myMethod(Class<? extends MyInterface>... myTypes) {
for (Class<? extends MyInterface> myType : myTypes) {
System.err.println("my Type:" +myType);
}
}
您最初的方式要求每个实施者的引用类型为MyInterface
。根据我提议的方式,您可以将您的推荐人MyInterface
或MyInterface
的任何子女(孙子等)。
答案 2 :(得分:1)
您必须使参数类型为covariant(定义上限)。只有一种类型具有签名Class<X>
,即X.class
。子类型为Class<? extends X>
类型。所以:
@SafeVarargs
public void myMethod(Class<? extends MyInterface>... myTypes) {
// do stuff
}
答案 3 :(得分:0)
您可以尝试这样的事情:
public void myMethod(Class<? extends MyInterface>... myTypes) {
for (Class<?> myType : myTypes) {
System.err.println("my Type:" +myType);
}
}
答案 4 :(得分:0)
您应该使用有界通配符来声明通用类型 - Class<? extends MyInterface>
public void myMethod(Class<? extends MyInterface>... myTypes) {
for (Class<? extends MyInterface> myType : myTypes) {
System.err.println("my Type:" +myType);
}
}