Java中的泛型+可选参数无法组合

时间:2012-09-05 13:56:09

标签: java generics

我正在为以下问题寻找优雅的解决方案:

//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);

这只是不被接受。是否可以组合可选参数和泛型?我找不到任何例子。

5 个答案:

答案 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。根据我提议的方式,您可以将您的推荐人MyInterfaceMyInterface的任何子女(孙子等)。

答案 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);
  }
}