1

最近我正在编写一些从 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;
    }
}

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

4

2 回答 2

1

每次只需创建一个新的小对象,以定义“每次”。请记住,典型 JRE 上的分配很小,但 GCing 静态数据的成本很高。

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

于 2010-04-19T14:28:54.240 回答
0

我认为你目前正在做的方式是你能找到的最简单的方式。

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

于 2010-04-19T15:18:20.027 回答