2012-05-09 2 views
0

は、以下に示すように、私は、標準の一般的なクラスを持っていることを考えてみましょう:特定のタイプのセットのみに制限する汎用クラスを定義するにはどうすればよいですか?

class Attribute<T>{ 
    public String name; 
    public T value; 
} 

がある所定のセットに種類を制限することが可能であり、例えば、私が唯一利用可能にしたいということを検討し、属性、 of:文字列、整数、ブール値、バイト[]。

これは「セミジェネリック」クラスのようなものです。

これができない場合は、これを実装するにはどのようなデザインが最適でしょうか?

おそらく、このようなものは、私はデザインの同じ種類を採用することができ、他のライブラリに存在します。ここでの意図は、これがAPIの一部になるということです。そのため、できるだけ直感的にユーザーに理解してもらいたいと考えています。

+0

アン脇には:C++では、このようなものは、一般に「コンセプト」と呼ばれます。ある種の制約のセットを指定します。コンパイラに頼って、コンセプトが違反している場所を特定できます(準最適なエラーメッセージで)。多分同じことがJavaで動作します。 – pmr

+0

@ pmr:話題以外、それは部分専門化と呼ばれるものですか? – Everyone

+1

@Everyoneいいえ、部分的な特殊化とは、テンプレート( 'generic')が特別な型でインスタンス化されたときに異なって動作することを意味します。 – pmr

答えて

1

セミリーズナブル:同じパッケージにこれらすべてを置く:

public class Attribute<T> { 
    Attribute() { 
    } 
} 

public class StringAttribute extends Attribute<String> { 
    public StringAttribute() { 
     super(); 
    } 
} 

public class IntegerAttribute extends Attribute<Integer> { 
    public IntegerAttribute() { 
     super(); 
    } 
} 

コンストラクタを持つことによってのみサブクラスが同じパッケージでなければならないであろうので、それはそれは保護されたパッケージになり何のアクセス修飾子を持っていません。次に、許可したい正確なサブクラスを指定します。

これは完全ではありませんが、何もないよりも優れています。プライベートコンストラクタと

別のオプションは、ネストされたクラス:

public class Attribute<T> { 
    public T value; 

    private Attribute() { } 

    public static class StringAttribute extends Attribute<String> { 
     public StringAttribute() { 
      super(); 
     } 
    } 

    public static class IntegerAttribute extends Attribute<Integer> { 
     public IntegerAttribute() { 
      super(); 
     } 
    } 
} 

および作成する:

Attribute<String> att = new Attribute.StringAttribute(); 
0

これはできません。パラメータの型は、型、または一連の型の(すべての)型のサブタイプにのみ制限できます。あなたがしたい制限の種類を実装するために私は考えることができる

唯一の方法は、実行時の型テストを使用することです。例えばメソッドが渡された時点でTのインスタンス。

関連する問題