簡體   English   中英

Java中的泛型+可選參數無法組合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM