说,我有一个通用类型,如下所示
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
并抛出异常。这是最好的方法吗?
在对此类型执行操作时遇到同样的问题。根据类型,我想做不同的操作。继承和有界通配符似乎是这种问题的一般方法,但这些都是原始的包装器。
答案 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;
}
}