Java通用类型标识

时间:2013-09-04 06:39:57

标签: java generics

这是我的班级结构。

public class Node<T> {
    private T value;

    public Node(T val) {
        this.value = val;
    }

    public T evaluate() {
         return value;
    };

}

T可以是IntegerDoubleDateLongString

现在,无论如何我能确切地知道T型是什么?谢谢。

4 个答案:

答案 0 :(得分:7)

您可以在通用变量上调用{/ 1}} 方法并找出该类。基本上泛型在运行时被删除,因此无界泛型只是getClass()。因此,您可以在该通用变量

上调用java.lang.Object类支持的所有方法

在运行时,通用对象上的Object将返回用于替换泛型的实际getClass()

例如

class

答案 1 :(得分:1)

更容易,使用instanceof

public class Node<T> {
  private T value;

  public Node(T val) {
    checkType(val);
    this.value = val;
  }

  public T evaluate() {
     return value;
  };

  private void checkType(T val) {
    if(val instanceof Integer) {
      //...
    }
  }

}

答案 2 :(得分:1)

虽然已经有一个已接受的答案,但我认为再添加一个答案可能会更好:

如@BaileyS所述,在没有T实例的地方无法获取T的信息。

解决方案很大程度上取决于你想要T的原因,以及你如何使用它。通常,如果我们需要逻辑的类型T(例如创建T的新实例),通常通过提供Class实例来完成。

例如,您可以将Node类设为:

public class Node<T> {
    private T value;
    private Class<T> valueType;

    public Node(T val, Class<T> valueType) {
        this.value = val;
        this.valueType = valueType;
    }
    //.....    
}

答案 3 :(得分:-1)

如果您知道您的节点将仅存储数字,则可以限制它。

public class Node<T extends Number> {

    private final T value;

    public Node(T val) {
        this.value = val;
    }

    public T evaluate() {
         return value;
    };

    public Class<? extends Number> type() { 
      return value.getClass();
    }       

}