3

这是我的班级结构。

public class Node<T> {
    private T value;

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

    public T evaluate() {
         return value;
    };

}

T 可以是IntegerDoubleDate或。LongString

现在,无论如何我可以确切地知道那个类型 T 是什么?谢谢。

4

4 回答 4

7

您可以在泛型变量上调用getClass()方法并找出类。基本上泛型在运行时被擦除,所以无界泛型不过是. 因此,您可以在该泛型变量上调用类支持的所有方法java.lang.ObjectObject

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

例如

public class Node<T> {
    private T value;

    public Node(T val) {
        Class<?> clazz = val.getClass();
        checkType(clazz);
        this.value = val;
    }

    public T evaluate() {
         return value;
    };

    private void checkType(Class<?> c) {
       if(c.getName().equals(Integer.class.getName())) {
        //...
       }
    }

}
于 2013-09-04T06:41:57.257 回答
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) {
      //...
    }
  }

}
于 2013-09-04T08:53:33.540 回答
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;
    }
    //.....    
}
于 2013-09-04T09:02:14.890 回答
-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();
    }       

}
于 2013-09-04T07:36:30.883 回答