考虑我有一个标准的泛型类,如下所示:
class Attribute<T>{
public String name;
public T value;
}
是否可以将类型限制为某个预定义的集合,例如,考虑我只想拥有以下可用的属性:字符串、整数、布尔值、字节 []。
所以这是一种“半通用”类。
如果这是不可能的,那么实现这一点的最佳设计是什么?
也许类似的东西存在于其他库中,我可以采用相同的设计。这里的意图是这将成为 API 的一部分,所以我想让它对用户尽可能直观。
半合理:将所有这些放在同一个包中:
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();
这不可能。您只能将参数类型限制为一个类型,或一组类型(全部)的子类型。
我能想到的实现您想要的那种限制的唯一方法是使用运行时类型测试;例如,在一个方法被传递一个T
.