当前位置: 首页 > 知识库问答 >
问题:

无法从集合转换为列表

席烨
2023-03-14

我试图通过将对象传递给“验证器”来验证库中的结果,其中验证器验证结果是否为空,并随后将传递的对象返回给调用方。例如:

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);

我知道参数绑定发生在运行时,这就是编译器抛出这个错误的原因。我正试图避免使用显式类型创建多个方法,而宁愿捕获实现collection的所有类型。

在不上传或创建多个显式类型重载方法的情况下,有没有其他方法可以做到这一点?

共有1个答案

田永春
2023-03-14

如果您的意图是返回“自我”,那么:

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的便利性,但本质上并不有用,要么您不能使用它,您需要一个“make a new collection”工厂。这将使您:


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>());
 类似资料:
  • 用以下方法对物体进行成像:

  • 问题内容: 原始列表将转换为正常。为什么原始列表的列表不能转换为的列表? 背景故事 (以减轻xy问题): 我正在使用return的API 。我碰巧知道它一直都是。我计划循环并构建自己的循环,但是我在尝试编写时试图修复(但不禁止)原始类型编译器警告。 我试过了: 但是这些会导致类型不匹配错误。 有趣的是,这没有给出警告或错误: 问题答案: // #1 (does compile) List raw

  • 问题内容: 问题 与新HashSet(Collection)等效的Scala)相关,如何将Java集合(例如)转换为Scala集合? 我实际上是在尝试将Java API调用转换为Spring的 (返回a )成Scala不可变。因此,例如: 这似乎有效。欢迎批评! 问题答案: 您的最后一条建议有效,但您也可以避免使用: 请注意,默认情况下,由于提供了此功能。

  • 假设我有一个名为student的对象列表。对象Student的定义如下 在学生列表中,可以有多个具有相同studentName但不同CourseTaking的学生对象。现在我想把学生名单变成一张studentName和courseTaking的地图,如下所示 关键是studentName,而值是将同一学生的所有课程设置放在一起作为一个集合。我如何使用stream()&collection()来实现

  • 我在我的项目中使用spring webflux与外部API进行通信。在我的项目中,我无法将Flux转换为List。 在尝试对collectList().block()执行同样的操作时,flux的所有元素都被连接到一个字符串中,并存储在List的第0个索引处。如果我返回Flux而不是List,那么它会发送预期的响应。但我需要操作内容并将其作为子对象添加到其他对象中&因此尝试返回列表。 预期结果:[“

  • 我有一个方法createCompliance响应(),它返回BOLConplationObject对象,在此之前,我将其更改为BOLConplationMono,因为我必须在其中调用另一个反应性服务。但是在这样做之后,我调用该服务的当前服务在第6行和第7行出现错误。 我为其更改了退货类型的另一项服务是