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