2010-04-19 77 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