Tan*_*nax 13 java generics static linked-list list
我已经读过你不能在泛型类中声明静态变量/方法,我真的不知道如何解决我的问题或解决它,所以我请求你的指导.
我想要的是一个通用的"索引",我的所有核心类都将扩展.我正在创建一个游戏引擎,一个例子就是我将拥有不同的游戏状态,这些游戏状态都会延伸State到反过来Nexus<State>.我想要静态头部和尾部的原因是我可以保留所有游戏状态的链表,因为它们在创建时都被添加到该列表中.
另一个例子是我将拥有不同的游戏对象,他们都扩展了GameObject谁Nexus<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;
}
}
Run Code Online (Sandbox Code Playgroud)
如果有人得到另一个解决方案或解决方法,我会全力以赴!
Pet*_*nov 10
Java泛型与C#泛型完全不同.有类型擦除,所以你不能说像Nexus<T>.aStaticPublicField(如在C#中).你只能说Nexus.aStaticPublicField.无法知道泛型类型是什么(因为您没有实例),因此您不能拥有类型为T的静态字段.
尝试这种方法:定义protected abstract子类实现的方法,以返回其类的static对象.
可能存在一些逻辑问题,但答案的基础在这里(即编译):
编辑:现在委托 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
}
}
Run Code Online (Sandbox Code Playgroud)