考虑我有一个标准的泛型类,如下所示:
class Attribute<T>{
public String name;
public T value;
}
是否可以将类型限制为某个预定义的集合,例如,考虑我只想要具有以下属性:String,Integer,Boolean,Byte []。
所以这是一种“半通用”类。
如果无法做到这一点,那么实现这一目标的最佳设计是什么?
也许这样的东西存在于其他库中,我可以采用相同的设计。这里的意图是这将是API的一部分,所以我想让用户尽可能直观。
答案 0 :(得分: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();
答案 1 :(得分:0)
这是不可能的。您只能将参数类型限制为类型或(全部)一组类型的子类型。
我能想到实现所需限制的唯一方法是使用运行时类型测试;例如在方法传递T
。