使用泛型类型调用静态方法
没有静态成员可以使用类型参数,但是否可以使用泛型类型参数调用静态成员?例如:-
abstract class Agent<A>{
void callAgent();
Agent(){
A.add();
}
}
这里的 add() 是一个静态方法。
在类似的主题上有一些C#问题和答案,但我不太确定如何在Java中解决这个问题。
没有静态成员可以使用类型参数,但是否可以使用泛型类型参数调用静态成员?例如:-
abstract class Agent<A>{
void callAgent();
Agent(){
A.add();
}
}
这里的 add() 是一个静态方法。
在类似的主题上有一些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,它将允许你做一些构造器魔术(看看弹簧如何@Configurable),但这变得更加棘手,使事情复杂化。
另一个选择是Scala。Java不对静态方法进行继承,因此您无法获得参数化模块(某些语言中的函数组称为函子...ocaml)。然而,Scala支持一个单例“对象”,它确实允许参数化泛函多态继承。
不可以。编译器不知道(解析为 )具有 add 方法。A
Object
而且,您首先不需要在泛型类型上调用静态方法。如果希望对每种类型的特定行为,请将其定义为非静态,在泛型声明中使用,然后调用它。extends BaseClass
从技术上讲,你也可以通过这种方式调用静态方法,但它很丑陋:
class Base {
public static void add() { }
}
class Foo<A extends Base> {
void bar() {
A a = null; // you can't use new A()!
a.add();
}
}