最近我正在编写一些我从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;
}
}
有没有更简单的方法来做这样的事情? 如果我使用的语法有效,可能会出现什么样的问题?
答案 0 :(得分:1)
每次只创建一个新的小小物体,用于“每次”的定义。请记住,典型JRE的分配很小,但GCing静态数据很昂贵。
虽然我认为您的语法可以在没有兼容性问题的情况下工作,但这会增加复杂性和不规则性,同时不会带来巨大的收益。
答案 1 :(得分:0)
我认为你现在这样做的方式是你最容易找到的。
问题是由于Java平台在内部实现泛型的方式 - 因为它使用类型擦除(出于向后兼容性的原因),类型信息在编译时丢失并阻止在静态声明等情况下使用泛型,因为这些类型的声明通常需要编译类型信息(Java目前不会为Generics做什么)。