使用泛型类型调用静态方法

2022-09-03 01:31:32

没有静态成员可以使用类型参数,但是否可以使用泛型类型参数调用静态成员?例如:-

abstract class Agent<A>{
    void callAgent();
    Agent(){
        A.add();                    
    }
}

这里的 add() 是一个静态方法。

在类似的主题上有一些C#问题和答案,但我不太确定如何在Java中解决这个问题。


答案 1

否,如果 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支持一个单例“对象”,它确实允许参数化泛函多态继承。


答案 2

不可以。编译器不知道(解析为 )具有 add 方法。AObject

而且,您首先不需要在泛型类型上调用静态方法。如果希望对每种类型的特定行为,请将其定义为非静态,在泛型声明中使用,然后调用它。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();
    }
}

推荐