如何限制Javagenerics类型中允许的类型数

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

public class GenericType { private T someVar; public void setVar(T var) { this.someVar = var; } //Rest of the code } 

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

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

使用inheritance:

Parent.java

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

ChildString.java

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

ChildInteger.java

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

ChildDouble.java

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

并且访问类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)); } } 

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

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

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

推断所需的类型,例如GenericType并在neccesary是最快捷的选项时使用instanceof 。 或者重载setVar(..)以接受Generic类中的受限类型。

  public static class GenericType { 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; } }