半合理的:これらすべてを同じパッケージに入れます:
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();