2010-04-19 78 views
1

最近我正在寫一些函數,我從哈斯克爾和翻譯成Java。 我的主要問題之一是我不能輕鬆創建一個泛型類型的靜態屬性。讓我通過一個小例子來解釋...有靜態泛型參數是Java的好方法嗎?

// An interface to implement functions 
public interface Func<P, R> { 
    public R apply(P p); 
} 

// What I want to do... (incorrect in Java) 
public class ... { 
    public static <T> Func<T, T> identity = new Func<T, T>() { 
     public T apply(T p) { return p; } 
    } 
} 

// What I do right now 
public class ... { 
    private static Func<Object, Object> identity = new Func<Object, Object>() { 
     public Object apply(Object p) { return p; } 
    } 
    @SuppressWarnings("unchecked") 
    public static <T> Func<T, T> getIdentity() { 
     return (Func<T, T>)identity; 
    } 
} 

有沒有更簡單的方法來做這樣的事情? 如果我使用的語法是有效的,可能會出現什麼樣的問題?

回答

1

每次只創建一個新的小小物件,用於「每次」的一些定義。請記住,典型JRE上的分配很小,但GCing靜態數據很昂貴。

雖然我認爲您的語法可以在沒有兼容性問題的情況下工作,但這會增加複雜性和不規則性,同時不會帶來巨大的收益。

0

我認爲你現在做這件事的方式是關於你最容易找到的。

問題出在Java平臺內部實現泛型的方式上 - 因爲它使用類型擦除(出於向後兼容的原因),類型信息在編譯時會丟失,並且會阻止泛型在靜態聲明,因爲這些類型的聲明通常需要編譯類型信息(Java目前不適用於泛型)。

+0

這裏,運行時沒有必要擁有類型信息。 – Kru 2010-04-19 15:39:50

+0

是的,但我認爲從Java編譯器的角度來看,它就像試圖做「public static T foo = new T()」,這是由於類型擦除而不可能實現的(這將有效地轉換爲「public static foo = new Object ()「......這絕對不對)。 – BCunningham 2010-04-19 18:19:17