2011-12-02 95 views
1

我以下困惑:的Java使用

我想做的事:

public class MyGenericClass<SomeType> extends SomeMoreAbstractClass<SomeType>{ 
    private Node<SomeType> beginNode; 
    private static final Node<SomeType> NOT_FOUND = null; 

    private static class Node<SomeType>{ 
    //class definition here 
    } 
} 

即我想用NOT_FOUND在检查代码null

我得到的错误Cannot make a static reference to the non-static type AnyType
在我宣布private static final Node<SomeType> NOT_FOUND = null;

我怎样才能得到角落找寻此行?我倾向于将它用作类变量而不是实例变量

回答

2

只需声明字段作为

private static final Node<?> NOT_FOUND = null; 

由于这是静态的,它会的MyGenericClass所有实例之间共享,所以它不能引用SomeType其为指定的类型参数每个类实例。 Node<?>使其与所有可能的类型参数兼容。这对于任何依赖于特定类型参数的任何事情都没有用,但幸运的是,与null的比较仍然有效。

+0

您可以将'Node <>'的任何参数化赋值给该非变量变量。 –

+0

@Tom:谢谢,修正。 –

+0

如果我使用它作为返回方法,例如'private node search(Object o){..... return NOT_FOUND}类型不匹配:无法从MyGenericClass.Node 转换为MyGenericClass.Node '。我必须明确地投下 – Cratylus

6

您需要删除static修饰符。按照定义,泛型是耦合到具体对象的。 static(对于所有对象都是相同的)成员不可能具有通用参数。

不要忘了,SomeType只是一个占位符,无论您使用什么类,当您instanciate对象。 (这样的:MyGenericClass<Integer> x = new MyGenericClass<Integer>();

+1

您可以通过静态成员使用泛型参数:'public static void method(T parameter){...}' – helpermethod

+1

@Oliver:但这是该特定方法的generica参数,而不是该类。 –