Java中有没有一种很好的静态泛型参数的方法?

Java中有没有一种很好的静态泛型参数的方法?,java,generics,static,properties,static-members,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 ... { publ

最近,我正在编写一些从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;
    }
}
//实现函数的接口
公共接口函数{
公共R应用(P);
}
//我想做的是。。。(在Java中不正确)
公共课。。。{
public static Func identity=new Func(){
公共T应用(tp){return p;}
}
}
//我现在做什么
公共课。。。{
私有静态Func标识=新Func(){
公共对象应用(对象p){return p;}
}
@抑制警告(“未选中”)
公共静态函数getIdentity(){
返回(Func)标识;
}
}
有没有更简单的方法来做这样的事情?
如果我使用的语法有效,可能会出现什么样的问题?

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


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

每次只创建一个新的小对象,对于“每次”的一些定义。请记住,典型JRE上的分配很小,但GCing静态数据非常昂贵


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

我认为您目前的做法是最容易找到的


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

我认为目前的方式是最容易找到的


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

在这里,不需要在运行时拥有类型信息。是的,但我认为从Java编译器的角度来看,这就像尝试执行“public static t foo=new t()这是不可能的,因为类型擦除(这将有效地被翻译为“publicstaticfoo=newobject()”,这肯定是不对的)。在这里,运行时不需要有类型信息。是的,但我认为从Java编译器的角度来看,这就像尝试执行“publicstatictfoo=new t()这是不可能的,因为类型擦除(这将有效地转换为“publicstaticfoo=newobject()”…这肯定是不对的)。