这是我的班级结构。
public class Node<T> {
private T value;
public Node(T val) {
this.value = val;
}
public T evaluate() {
return value;
};
}
T可以是Integer
,Double
,Date
,Long
或String
。
现在,无论如何我能确切地知道T型是什么?谢谢。
答案 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();
}
}