在泛型类中声明静态泛型变量

2022-09-04 08:36:59

我已经读到你不能在泛型类中声明静态变量/方法,我真的不知道如何解决我的问题或解决它,所以我请求你的指导。

我想要的是一个通用的“索引”,我所有的核心类都将扩展它。我正在创建一个游戏引擎,一个例子是,我将有不同的游戏状态,这些状态都扩展了谁又扩展了。我想要静态的头部和尾部的原因是,我可以保留所有游戏状态的链接列表,因为它们在创建时都会添加到该列表中。StateNexus<State>

另一个例子是,我将有不同的游戏对象,他们都扩展谁反过来扩展。GameObjectNexus<GameObject>

这是名为:Nexus

public abstract class Nexus<T> 
{

    private static T head = null;
    private static T tail = null;

    private T next = null;
    private static int num = 0;

    protected Nexus() { this.Add( (T)this ); }

    public T Add( T obj )
    {

        ((Nexus)obj).next = null;
        if( num++ == 0 ) head = tail = obj;
        else             tail = ( tail.next = obj );

        return obj;

    }

}

如果有人有其他解决方案或解决方法,我全都洗耳恭听!


答案 1

Java泛型与C#泛型完全不同。存在类型擦除,因此不能说类似的东西(如C#)。你只能说.没有办法知道泛型类型是什么(因为你没有实例),因此你不能有一个T类型的静态字段。Nexus<T>.aStaticPublicFieldNexus.aStaticPublicField


答案 2

试试这种方法:定义一个子类实现的方法,以返回类的对象。protected abstractstatic

可能有一些逻辑问题等,但答案的基础知识在这里(即编译):

编辑:现在委托给HeadAndTail

/** <T> A subclass of Nexus */
abstract class Nexus<T extends Nexus<T>> { // This syntax lets you confine T to a subclass of Nexus
    private T next;

    protected Nexus() {
        this.add((T) this);
    }

    public T add(T obj) {
        // Delegate to HeadAndTail
        return getHeadAndTail().add(obj);
    }

    /** @return a static for the class */
    protected abstract HeadAndTail<T> getHeadAndTail();
}

/** Bundled into one Object for simplicity of API */
class HeadAndTail<T extends Nexus<T>> {
    T head = null;
    T tail = null;
    int num = 0;

    public T add(T obj) {
        obj.next = null;
        if (num++ == 0)
            head = tail = obj;
        else
            tail = tail.next = obj;

        return obj;
    }
}

class ConcreteNexus extends Nexus<ConcreteNexus> {
    // This is the static object all instances will return from the method
    private static HeadAndTail<ConcreteNexus> headAndTail = new HeadAndTail<ConcreteNexus>();

    protected HeadAndTail<ConcreteNexus> getHeadAndTail() {
        return headAndTail; // return the static
    }
}