如何限制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; } }