如何获取泛型方法调用中传递的类型名称?

时间:2016-07-04 06:52:09

标签: java generics

我需要实现一个功能类似于以下方法的方法:

static <T extends Object> T validateObj (T obj) throws ValidationException {
  // ValidationException is a custom Exception class
  if (obj == null) {
    throw new ValidationException(T.class.getSimpleName() + errorMsgTemplate);
  } else {
    return obj;
  }
}

系统如何使用该功能的示例:

try {
  RandomAccessFile file = getFile(pathName, "r");  // Custom method. May return null
  file = Validator.validateObj(file);
} catch (Exception e) {
  // Handle exception
}
// Use file

在尝试记录错误时,无论传递的实际对象是否为null,如何为每个特定方法调用获取T的类名?要传递给验证方法的对象变量的类型始终为方法调用者所知。

更新:虽然我选择了Bambino的答案,但这里也是对StuPointerException的回答。由于处理现有代码的限制,他的答案更适合我的具体问题。但是,我确实相信Bambino的答案是更正确的实施解决方案。

3 个答案:

答案 0 :(得分:1)

这是不可能的,我害怕; - name: Build docker image become: yes docker_image: path: /tmp/foo name: foo state: present - name: Tag docker image become: yes docker_image: name: foo repository: foo tag: "{{ version.stdout }}" state: present 返回对象的类。当你拥有getClass时,你没有物品,所以你无法获得它的类型。

解决这个问题的一种方法是强制调用者包含对他们正在(或可能)传递的类的引用:

null

答案 1 :(得分:1)

请查看Objects.requireNonNull以了解您所需的功能。

答案 2 :(得分:0)

如果您有表格的通用方法

static <T> T validateObj(T obj) {
    // code
}

然后T的类型由您传入的对象的类确定。也就是说,T将始终完全是您传入的类型。这意味着您可以调用{ {1}}获取课程,只要它不是空的。

如果您传递obj.getClass(),则会将null视为T