パラメーターなしのコンストラクターが必要であるという制約を T 型に設定したいと考えています。C# では次のようになります。
public interface Interface<T> where T : new() { }
この機能は Java で利用できますか?
パラメーターなしのコンストラクターが必要であるという制約を T 型に設定したいと考えています。C# では次のようになります。
public interface Interface<T> where T : new() { }
この機能は Java で利用できますか?
Java でコンストラクターのインターフェースを定義することはできません。また、型の分散以外の制約を型パラメーターに設定することもできません。
あなたの更新された質問に答える:クラスのみが Java でコンストラクターを持つことができます。T - は型リテラルです。クラスである必要はありません。実行時にリフレクションを使用して、クラスが ParameterizedType であるかどうか、実際にクラスであるパラメーターがあるかどうか、および空のコンストラクターがあるかどうかを確認できます。
必要なコンストラクターで T をクラスに拡張することができます
public interface Interface<T extends Constructable>{}
public abstract class Constructable{
public Constructable(params..){
}
}
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 を返す場合、クラスには既定のコンストラクターがないことがわかり、例外またはアプリケーションに適したものをスローできます。