1

最近、Haskell から取って Java に変換するいくつかの関数を書いています。私が抱えている主な問題の 1 つは、ジェネリック型の静的プロパティを簡単に作成できないことです。少し例を挙げて説明しましょう...

// 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 での割り当てはごくわずかですが、静的データの GC にはコストがかかることに注意してください。

あなたの構文は互換性の問題なしに機能するように作成できると思いますが、複雑さと不規則性が追加され、大きなメリットはありません。

于 2010-04-19T14:28:54.240 に答える
0

あなたが現在行っている方法は、あなたが見つけようとしている最も簡単な方法だと思います。

この問題は、Java プラットフォームが Generics を内部で実装する方法に起因します -- 型消去を使用するため (下位互換性のため)、コンパイル時に型情報が失われ、静的宣言などの状況で Generics を使用できなくなります。宣言では通常、型情報をコンパイルする必要があります (Java は現在、ジェネリックではこれを行いません)。

于 2010-04-19T15:18:20.027 に答える