有一个很好的方法来获得静态通用参数是Java吗?

时间:2010-04-19 14:22:20

标签: java generics static properties static-members

最近我正在编写一些我从Haskell中获取并转换为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;
    }
}

有没有更简单的方法来做这样的事情? 如果我使用的语法有效,可能会出现什么样的问题?

2 个答案:

答案 0 :(得分:1)

每次只创建一个新的小小物体,用于“每次”的定义。请记住,典型JRE的分配很小,但GCing静态数据很昂贵。

虽然我认为您的语法可以在没有兼容性问题的情况下工作,但这会增加复杂性和不规则性,同时不会带来巨大的收益。

答案 1 :(得分:0)

我认为你现在这样做的方式是你最容易找到的。

问题是由于Java平台在内部实现泛型的方式 - 因为它使用类型擦除(出于向后兼容性的原因),类型信息在编译时丢失并阻止在静态声明等情况下使用泛型,因为这些类型的声明通常需要编译类型信息(Java目前不会为Generics做什么)。