0

以下に示すように、私が標準の汎用クラスを持っていると考えてください。

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

タイプを特定の事前定義されたセットに制限することは可能ですか。たとえば、String、Integer、Boolean、Byte[]の属性のみを使用できるようにしたい場合を考えてみてください。

つまり、これは一種の「セミジェネリック」クラスです。

これが不可能な場合、これを実装するための最良の設計は何でしょうか?

おそらく、このようなものが他のライブラリにも存在し、同じ種類のデザインを採用することができます。ここでの意図はこれがAPIの一部になることなので、ユーザーにとって可能な限り直感的にしたいと思います。

4

2 に答える 2

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();
于 2012-05-09T21:55:23.710 に答える
0

それは不可能。パラメータタイプは、タイプ、またはタイプのセット(すべて)のサブタイプにのみ制限できます。

必要な種類の制限を実装するために私が考えることができる唯一の方法は、ランタイムタイプのテストを使用することです。たとえば、メソッドが渡されるポイントで。のインスタンスT

于 2012-05-09T16:14:17.430 に答える