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

aps*_*aps 12 java generics static

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

abstract class Agent<A>{
    void callAgent();
    Agent(){
        A.add();                    
    }
}
Run Code Online (Sandbox Code Playgroud)

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

关于类似主题有一些C#问题和答案,但我不太清楚如何在Java中进行.

Ada*_*ent 9

如果A是泛型类型,请不要这样做.(Bozho快速回答:)并且可能认为A是具体类型.

将起作用的是以下内容.

abstract class Agent extends Blah<ConcreteA>{
    void callAgent();
    Agent() {
        ConcreteA.add();
    }
}
Run Code Online (Sandbox Code Playgroud)

但它可能不是你想要做的.

阅读你的评论之后听起来你真正想要做的是:

abstract class Agent<A extends SomeClassThatSupportsAdd> {

    void callAgent();
    protected abstract A createNew();

    Agent() {
        A a = createNew();
        A.add();
    }
}
Run Code Online (Sandbox Code Playgroud)

您的子类必须覆盖createNew().

如果你仍然不喜欢它,你可以看一下AspectJ,它可以让你做一些构造函数魔术(看看spring如何做@Configurable)但是这会变得更加棘手并使事情复杂化.

另一种选择是Scala.Java不会对静态方法进行继承,因此您无法获取参数化模块(某些语言中的函数组称为函数... ocaml).但是,Scala支持单个"对象",它允许参数化功能多态继承.

  • 为什么需要从 A 创建一个新实例来调用静态方法? (2认同)

Boz*_*zho 6

你不能.编译器不知道A(解析为Object)具有add方法.

而且您首先不需要在泛型类型上调用静态方法.如果需要每种类型的特定行为,请将其定义为非静态,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();
    }
}
Run Code Online (Sandbox Code Playgroud)