[英]Calling a static method using generic type
沒有 static 成員可以使用類型參數,但是否可以使用泛型類型參數調用 static 成員? 例如:-
abstract class Agent<A>{
void callAgent();
Agent(){
A.add();
}
}
這里 add() 是一個 static 方法。
有一些關於類似主題的 C# 問題和答案,但我不太確定如何在 Java 中討論它。
不,如果 A 是泛型類型,則不能這樣做。 (博卓回答得很快:)可能還以為A是具體的類型。
以下是可行的。
abstract class Agent extends Blah<ConcreteA>{
void callAgent();
Agent() {
ConcreteA.add();
}
}
但這可能不是您想要做的。
閱讀您的評論后,聽起來您真正想做的是:
abstract class Agent<A extends SomeClassThatSupportsAdd> {
void callAgent();
protected abstract A createNew();
Agent() {
A a = createNew();
A.add();
}
}
您的子類必須覆蓋createNew()
。
如果你仍然不喜歡,你可以看看 AspectJ,它可以讓你做一些構造函數(看看 spring 如何做@Configurable),但這變得更加棘手和復雜。
另一種選擇是 Scala。 Java 在 static 方法上不執行 inheritance,因此您無法獲得參數化模塊(某些語言中的函數組,這稱為函子。) 然而,Scala 支持 singleton“對象”,它允許參數功能多態 inheritance。
你不能。 編譯器不知道A
(解析為Object
)具有 add 方法。
而且您首先不需要在泛型類型上調用 static 方法。 如果您想要每種類型的特定行為,請將其定義為非靜態,在 generics 聲明中使用extends BaseClass
並調用它。
從技術上講,您也可以這樣調用 static 方法,但這很丑:
class Base {
public static void add() { }
}
class Foo<A extends Base> {
void bar() {
A a = null; // you can't use new A()!
a.add();
}
}
這是不可能的,因為A
類型不一定包含add()
方法。 編譯器不允許這樣做,因為它不能保證它會工作。
實際上,您可以在類型參數上調用 static 方法(盡管它不是動態完成的)。
嘗試這個:
public class Main<T extends Collections> {
public static void main(String[] args) {
new Main<>().foo();
}
void foo() {
List<Integer> list = Arrays.asList(2, 3, 1);
T.sort(list);
System.out.println(list);
}
}
我不知道為什么語言設計者認為允許這樣做是個好主意。
從事先不知道的枚舉中獲取值很方便。
public static <T extends Enum<T>> T enumFromName(String name, Class<T> clazz) {
return StringUtils.isEmpty(value) ? null : T.valueOf(clazz, name);
}
有:
enum ProductType { FOOD, ELECTRONICS, ... }
你可以做:
ProductType p = enumFromName("FOOD", ProductType.class);
我想您也可以在自己的課程中利用這一點,盡管我不建議過多地使用static
。
您可以使用反射來調用 class T 的 static 方法。例如:
public Agent<T>{
private final Class<T> clazz;
public Agent(Class<T> clazz){
this.clazz = clazz;
executeAddMethodOfGenericClass();
}
public void executeAddMethodOfGenericClass() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Method method = clazz.getMethod("add");
method.invoke(null);
}
}
但我可以得到例外。 當心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.