2

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

public class GenericType<T> {
   private T someVar;

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

   //Rest of the code
}

我想让它只采用特定类型(字符串/整数/双精度)。我知道有界通配符,但在这里它们对我没有帮助。在 setVar() 中,instanceof如果类型不是整数/字符串等,我可以检查并抛出异常。这是最好的方法吗?

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

4

3 回答 3

6

使用继承:

父类.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...
    }

}

并访问子类而不是直接访问父类。

更新

这里再举一个例子:

通用类型.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);
    }
}

具体通用.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));
    }
}
于 2012-05-04T07:44:29.953 回答
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;
    }
  }
于 2012-05-04T08:53:07.310 回答
0

你不能(不仅仅是扩展一些东西,但在你的情况下你想要一些不相关的类型,所以它没有帮助)。

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

这样,您仍然可以创建 MyClass,但无法创建此类型的实例。(但你可以施放它,因为它不是万无一失的)

于 2012-05-04T07:50:51.910 回答