从泛型类型参数检索高级信息

时间:2019-07-15 16:16:34

标签: java generics

我想知道Java 12中是否有可能在通用类型参数上调用T.class,或者是否有解决方法?

由于我反对一遍又一遍地重写相同的代码逻辑,因此我急于调用T.class将任何类型的Java对象传递给我的方法,并编写一些映射功能来处理Optional<T>展开逻辑。

public SpecificEntity specific(final Long id) throws EntityNotFoundException {
    final Optional<SpecificEntity> optional = this.specificEntityRepository.findById(id);
    if (optional.isEmpty()) {
      throw new EntityNotFoundException(SpecificEntity.class, "id", id.toString());
    }
    return optional.get();
  }

我希望有可能像这样重写上面的代码:

public <T> T generic(final Optional<T> optional, final Long id) throws EntityNotFoundException {
    if (optional.isEmpty()) {
      throw new EntityNotFoundException(T.class, "id", id.toString());
    }
    return optional.get();
  }

2 个答案:

答案 0 :(得分:0)

一个简单的解决方案是在函数Class<T>中添加一个参数,就像这样:

generic(optionalOfInteger, Integer.class, 0),例如

您可能可以使用的另一种方法涉及利用反射,该方法在此处记录:Get type of a generic parameter in Java with reflection

但是请记住,基于反射的方法可能会很慢。

答案 1 :(得分:0)

使用会更好

class Task {
     Name _name;
}
class Name with ChangeNotifier {
     String _name;
}

这样,您的方法的用户将不得不提供他想要获取的实体的类?