泛型中静态声明的Java用法

时间:2011-12-02 13:25:55

标签: java generics

我对以下内容感到困惑:

我想这样做:

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 个答案:

答案 0 :(得分:6)

您需要删除static修饰符。根据定义,泛型与具体对象相关联。对于具有通用参数的static(=对所有对象都相同)成员是不可能的。

当您实例化对象时,不要忘记SomeType只是您使用的类的占位符。 (像这样:MyGenericClass<Integer> x = new MyGenericClass<Integer>();

答案 1 :(得分:2)

只需将该字段声明为

即可
private static final Node<?> NOT_FOUND = null;

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