4

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

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

这只是不被接受。可选参数和泛型不能结合是真的吗?我找不到任何例子。

4

5 回答 5

2

我会尝试

public void myMethod(Class<? extends MyInterface>... myTypes) {

Class<MyInterface>必须MyInterface.class不是子类。

于 2012-09-05T13:59:47.877 回答
1

使用? extends通配符使其工作。

public void myMethod(Class<? extends MyInterface>... myTypes) {
    for (Class<? extends MyInterface> myType : myTypes) {
        System.err.println("my Type:" +myType);
    }
}

您最初执行此操作的方式要求每个实现者的引用类型为MyInterface. 使用我建议的方式,您可以将您的推荐人MyInterface或任何孩子(孙子等)作为MyInterface.

于 2012-09-05T13:59:05.100 回答
1

您必须使参数类型协变(定义上限)。只有一种类型有签名Class<X>,那就是X.class。子类型是 type Class<? extends X>。所以:

@SafeVarargs 
public void myMethod(Class<? extends MyInterface>... myTypes) {
  // do stuff
}
于 2012-09-05T14:00:01.757 回答
0

你可以尝试这样的事情:

public  void  myMethod(Class<? extends MyInterface>... myTypes) {
      for (Class<?> myType : myTypes) {
         System.err.println("my Type:" +myType);
      }
    }
于 2012-09-05T14:02:48.967 回答
0

您应该使用有界通配符来声明您的泛型类型 -Class<? extends MyInterface>

public void myMethod(Class<? extends MyInterface>... myTypes) {
  for (Class<? extends MyInterface> myType : myTypes) {
     System.err.println("my Type:" +myType);
  }
}
于 2012-09-05T14:03:13.303 回答