如何定义一个仅限于某一类型的泛型类?

时间:2012-05-09 15:58:20

标签: java templates generics

考虑我有一个标准的泛型类,如下所示:

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

是否可以将类型限制为某个预定义的集合,例如,考虑我只想要具有以下属性:String,Integer,Boolean,Byte []。

所以这是一种“半通用”类。

如果无法做到这一点,那么实现这一目标的最佳设计是什么?

也许这样的东西存在于其他库中,我可以采用相同的设计。这里的意图是这将是API的一部分,所以我想让用户尽可能直观。

2 个答案:

答案 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

的实例时