2011-12-02 96 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參數,而不是該類。 –