如何限制Java泛型类型中允许的类型数量

时间:2012-05-04 07:35:51

标签: java generics

说,我有一个通用类型,如下所示

public class GenericType<T> {
   private T someVar;

   public void setVar(T var) { this.someVar = var; }

   //Rest of the code
}

我想允许它只采用特定类型(String / Integer / Double)。我知道有限的通配符,但他们在这里没有帮助我。在setVar()中,如果type不是Integer / String等,我可以检查instanceof并抛出异常。这是最好的方法吗?

在对此类型执行操作时遇到同样的问题。根据类型,我想做不同的操作。继承和有界通配符似乎是这种问题的一般方法,但这些都是原始的包装器。

3 个答案:

答案 0 :(得分:6)

使用继承:

<强> Parent.java

public abstract class Parent<T> {
    public abstract void display(T t);
}

<强> ChildString.java

public class ChildString extends Parent<String> {

    @Override
    public void display(String t) {
        // Do something here...
    }

}

<强> ChildInteger.java

public class ChildInteger extends Parent<Integer> {

    @Override
    public void display(Integer t) {
        // Do something here...
    }

}

<强> ChildDouble.java

public class ChildDouble extends Parent<Double> {

    @Override
    public void display(Double t) {
        // Do something here...
    }

}

访问class child而不是直接访问父类。

更新

这是另一个例子:

<强> GenericType.java

public class GenericType {

    public void display(Object t) {
        String msg;
        if(t instanceof String) {
            msg = "String";
        } else if (t instanceof Integer) {
            msg = "Integer";
        } else if (t instanceof Double) {
            msg = "Double";
        } else {
            msg = "Another Object";
        }

        System.out.println(msg);
    }
}

<强> SpecificGeneric.java

public class SpecificGeneric {

    public static void main(String[] args) {
        GenericType basicType = new GenericType();

        basicType.display(new String());
        basicType.display(new Integer(1));
        basicType.display(new Double(0.1));
    }
}

答案 1 :(得分:0)

你不能(超过扩展的东西,但在你的情况下,你想要几个不相关的类型,所以它没有帮助。)

你能做什么,是检查实例传递给方法(你已经知道了)。如果你想要一个通用类的实例,例如。字符串另一个为整数,但不允许例如。 Point2D,你可以使用参数Class clazz制作构造函数,并在构造时检查它是否允许。 如果你更偏执,你可以存储那个clazz并在所有函数中比较参数是否真的是该类。

这样,您仍然可以创建MyClass,但无法使用此类型创建实例。 (但你可以施展它,而不是傻瓜证明)

答案 2 :(得分:0)

推断所需的类型说GenericType<Double>,并在必要时使用instanceof是最快捷的选择。或者重载setVar(..)以接受Generic类中的受限类型。

  public static class GenericType<T>
  {
    private T someVar;
    public void setVar(String var)
    {
      this.someVar = (T) var;
    }

    public void setVar(Integer var)
    {
      this.someVar = (T) var;
    }

    public void setVar(Double var)
    {
      this.someVar = (T) var;
    }
  }