6

重複の可能性:
Java ジェネリック制約には、C# のような既定のコンストラクターが必要です

パラメーターなしのコンストラクターが必要であるという制約を T 型に設定したいと考えています。C# では次のようになります。

public interface Interface<T> where T : new() { }

この機能は Java で利用できますか?

更新:ジェネリック型 T にコンストラクターを持たせるためのトリックはありますか?

4

4 に答える 4

5

Java でコンストラクターのインターフェースを定義することはできません。また、型の分散以外の制約を型パラメーターに設定することもできません。

于 2012-04-04T15:00:33.143 に答える
1

あなたの更新された質問に答える:クラスのみが Java でコンストラクターを持つことができます。T - は型リテラルです。クラスである必要はありません。実行時にリフレクションを使用して、クラスが ParameterizedType であるかどうか、実際にクラスであるパラメーターがあるかどうか、および空のコンストラクターがあるかどうかを確認できます。

于 2012-04-04T15:16:30.443 に答える
0

必要なコンストラクターで T をクラスに拡張することができます

public interface Interface<T extends Constructable>{}

public abstract class Constructable{
    public Constructable(params..){
     }
}
于 2012-04-04T15:16:06.330 に答える
0

Java では、コンパイル時にこれを行うことはできません。リフレクションを使用して次のようなことを行うことにより、実行時にこれを確認することが最善だと思います。

public static <T> boolean hasDefaultConstructor(Class<T> cls) {
    Constructor[] constructors = cls.getConstructors();
    for (Constructor constructor : constructors) {
        if (constructor.getParameterTypes().length == 0) {
            return true;
        }
    }

    return false;
}

次に、次のようにしてこの関数を呼び出すことができます。

hasDefaultConstructor(String.class)  => true;
hasDefaultConstructor(Integer.class) => false;

この関数が false を返す場合、クラスには既定のコンストラクターがないことがわかり、例外またはアプリケーションに適したものをスローできます。

于 2012-04-04T15:08:09.740 に答える