我试图通过将对象传递给“验证器”来验证来自库(使用 Quarkus 的 Panache/Hibernate)的结果,其中验证器验证结果不为空,然后将传递的对象返回给调用者。
在这个例子中,listAll()
is fromPanacheEntityBase
并简单地返回一个Employee
对象列表。如果这List
是空的,就像结果集中没有结果一样,它不会抛出异常。因此,为了避免在每次调用中进行空/空检查,我正在编写以下便利类来验证所有结果。
在我的验证器中:
public class ResultValidator {
public static <T> Collection<T> validate(Collection<T> result, Class<T> type) throws EmptyResultException {
if (result.isEmpty()) {
throw new EmptyResultException();
}
return result;
}
}
调用者会这样调用:
return ResultValidator.validate(listAll(), Employee.class);
相反,我不得不向上推:
return (List<Employee>) ResultValidator.validate(listAll(), Employee.class);
上面调用 的代码会validate
导致编译器错误Cannot convert from Collection<> to List<>
。除非我在我的实现中向上转换List<>
或明确定义List<>
类型,否则我validate
会收到此错误。
我需要在我的validate(Collection, Class)
实现中更改什么以避免向上转换或声明显式类型?
如果您的意图是返回 'self',则:
public static <T, C extends Collection<T>> C validate(C result, Class<T> type) {
// note that requiring a `Class<T>` is a code smell...
if (result.isEmpty()) throw new EmptyResultException();
return result;
}
List<String> list = ...;
list = validate(list, String.class);
现在工作正常,但请注意,无法创建新C
实例。你要么result
直接返回,因此validate
返回的事实充其量只是一些代码/API 的便利,但本质上没有用,或者,你不能使用它,你需要一个“创建一个新的”集合'工厂。这会让你:
public static <T, C extends Collection<T>> C validate(C result, Class<T> type, Supplier<C> collectionMaker) {
...
}
调用者必须提供一些东西的地方。例如:
List<String> list = ...;
validate(list, String.class, () -> new ArrayList<String>());
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句