2010-04-19 4 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 플랫폼이 Generics를 내부적으로 구현하는 방식 - 이전 버전과의 호환성을 위해 유형 삭제를 사용하므로 유형 정보가 컴파일 타임에 손실되고 정적 선언과 같은 상황에서 Generics 사용을 금지합니다. 이러한 종류의 선언은 전형적으로 유형 정보가 컴파일되도록 요구하기 때문에 (Java는 현재 Generics를 위해하지 않을 것이다).

+0

여기에서는 런타임에 유형 정보가 필요하지 않습니다. – Kru

+0

사실,하지만 자바 컴파일러의 관점에서 보면 "public static T foo = new T()"를 시도하는 것과 비슷하다고 생각합니다. 이는 형식 지움으로 인해 가능하지 않습니다 ("public static foo = new Object() "... 분명히 옳지 않다). – BCunningham

관련 문제