【问题标题】:why does the stream not recognize my type?为什么流无法识别我的类型?
【发布时间】:2014-02-03 05:34:42
【问题描述】:
public class ActivityInventoryMem<Activity> extends TreeSet<Activity> implements ActivityInventory<Activity> {

  @Override
  public ToDo toDo( LocalDate date ) {
    Stream<Activity> s = this.parallelStream();

    s.filter( a ->  a.completed() );
    return new ToDo();
  }
}

这是个例外

java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: java.util.stream.Stream.filter
at com.lm.infrastructure.memory.ActivityInventoryMem.toDo(ActivityInventoryMem.java:16)
at com.lm.infrastructure.memory.ActivityInventoryMemNGTest.testToDo(ActivityInventoryMemNGTest.java:46)

我在 jdk 8 中运行它,并将以下内容放在我的 pom.xml 中,现在它似乎可以识别 lambda

    <!-- maven-compiler-plugin -->
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>

问题(根据我从 netbeans 收集的信息)是它将 a 视为 Object 而不是 Activity,因此它看不到 .completed(),我该如何解决这个问题?

【问题讨论】:

  • 我不知道这是否是您的完整代码,但如果是,s.filter() 调用实际上什么都不做。这是一个懒惰的中间操作。在您添加终端操作之前,流实际上不会做任何事情。请参阅java.util.stream 类文档。

标签: java filter lambda java-8 java-stream


【解决方案1】:

在您的声明中:

public class ActivityInventoryMem<Activity> extends TreeSet<Activity> implements ActivityInventory<Activity>
//                                 ^ (1)                     ^ (2)                                  ^ (3)

Activity 在 (2) 和 (3) 处的用途是作为 TreeSetActivityInventory 的类型参数,而 (1) 处的用途是声明一个新类型参数为您的ActivityInventoryMem 课程。因此,在该类中使用符号 Activity 并不是指您实际的 Activity 类,而是指某个实际类型未知的类型参数。

你可能只想在你的类声明中去掉 (1):

public class ActivityInventoryMem extends TreeSet<Activity> implements ActivityInventory<Activity>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 2021-12-17
    • 2011-05-26
    相关资源
    最近更新 更多