无法从 Collection<> 转换为 List<>

用户0000001

我试图通过将对象传递给“验证器”来验证来自库(使用 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)实现中更改什么以避免向上转换或声明显式类型?

rzwitserloot

如果您的意图是返回 '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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

无法从“System.Generic.Collection.List”转换

无法从 System.Collection.Generic.List<Dal.Questio> 转换为 Dal.Questio

无法将类型“System.Collection.Generic.List<T>”隐式转换为“T”

无法将 System.Linq.IOrderedQuerable 转换为 System.Collection.Generic.List 错误

无法从List <List>转换为List <List <?>>

类Collection的对象无法转换为int

将Collection <Object>转换为List <String>

2错误-无法将类型system.collection.generic.list <float>隐式转换为float,也无法将float []类型隐式转换为float

无法从List <Bar>转换为List <Foo>

无法转换类型System.Collection.Generic.List <T>

无法从Flux <String>转换为List <String>

类 Illuminate\Support\Collection 的对象无法转换为 int

类 Illuminate\Support\Collection 的对象无法转换为 int -laravel

Illuminate \ Database \ Eloquent \ Collection类的对象无法转换为int

将Seq或List转换为collection.immutable.Queue

无法将List <ClassA>转换为List <T>

如何将Collection <Collection <Double >>转换为List <List <Double >>?

发布WebAPI时无法将类型db.entities1隐式转换为system.collection.generic.list <aspnetWEBAPI.Home_Visits_Request>

Collections.sort:无法从void转换为List

List <Trail>无法转换为上下文

无法将java.util.List转换为Scala列表

类型不匹配:无法从ArrayList转换为List

无法将initializer_list转换为class <int>

无法将源类型'List <Person>'转换为IList <ISomething>

无法将Task <List <TEntity >>转换为Task <IList <TEntity >>

无法将IEnumerable类型转换为List C#

无法将字符串转换为List <int>

C# 无法使用 List 将 int[] 转换为 int

类型不匹配:无法从元素类型 Object 转换为 List