制約

2012-04-04 20 views
6

可能性の重複:
Java generics constraint require default constructor like C#制約

私はそれがパラメータなしのコンストラクタを持たなければならないことをT型に制約を設定します。 C#では、それは次のようになります。

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

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

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

+0

Javaインターフェイスの面白い質問...コンストラクタとのインターフェイス: –

答えて

1

は、あなたの更新の質問に答えるたいコンストラクタを持つクラスを拡張させることができ

5

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

+0

ちょうどこれを言っていた... = D –

+7

**誤解**これはジェネリックタイプTのコンストラクタを定義し、インターフェイスは定義しません。 – Aliostad

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を返すと、クラスにはデフォルトのコンストラクタがないことがわかります。例外を投げたり、アプリケーションに適したものを投げることができます。あなたはTはあなたが

public interface Interface<T extends Constructable>{} 

public abstract class Constructable{ 
    public Constructable(params..){ 
    } 
} 
0

:唯一のクラスは、Java、Tでコンストラクタを持つことができますが - リテラルの型で、それは必要ありませんにありクラスである。リフレクションを使用する実行時に、クラスが実際にクラスであり、コンストラクタが空の場合は、ParameterizedTypeにパラメータがあるかどうかを確認できます。

+0

しかし、class inheriting Constructableにはデフォルトのコンストラクタ(パラメータなし)がない場合があります。 – ahanin

+0

もちろん、継承するとアクセス修飾子の範囲を減らすことはできません。親クラスにパラメータを持たないパブリックコンストラクタがある場合、すべてのサブクラスにパラメータなしのコンストラクタがあります。 –

+1

まあ、実際はそうではありません。アクセス修飾子とは何の関係もありません。コンストラクタのセットは、特定のクラスごとに一意です。親がデフォルトコンストラクタを持っていない限り、子クラスのすべてのコンストラクタでスーパーコンストラクタの1つを呼び出す必要があります。 BがAのサブクラスであるとしましょう。Aにはデフォルトコンストラクタがあります。 BにコンストラクタB(String)のみを定義すると、新しいB()でBをインスタンス化することはできません。 – ahanin