我正在尝试为Apache Flink编写一些用例.我经常遇到的一个错误是
could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[SomeType]
Run Code Online (Sandbox Code Playgroud)
我的问题是,当它们发生时以及它们不发生时我无法确定.
最近的例子如下
...
val largeJoinDataGen = new LargeJoinDataGen(dataSetSize, dataGen, hitRatio)
val see = StreamExecutionEnvironment.getExecutionEnvironment
val newStreamInput = see.addSource(largeJoinDataGen)
...
Run Code Online (Sandbox Code Playgroud)
where LargeJoinDataGen extends GeneratorSource[(Int, String)]
和GeneratorSource[T] extends SourceFunction[T]
,都在单独的文件中定义.
当我试图建立这个时,我得到了
Error:(22, 39) could not find implicit value for evidence parameter of type org.apache.flink.api.common.typeinfo.TypeInformation[(Int, String)]
val newStreamInput = see.addSource(largeJoinDataGen)
Run Code Online (Sandbox Code Playgroud)
1.为什么给定的例子中有错误?
2.当这些错误发生时以及如何在将来避免它们时,一般指导原则是什么?
PS:第一个scala项目和第一个flink项目所以请耐心等待
所以我上了一堂课
public class MenuBar extends JMenuBar {
MenuBarController controller;
public MenuBar() {
JMenu menu = new JMenu("File");
menu.add(createMenuItem("Report", controller::writeReport));
menu.add(createMenuItem("Save", controller::save));
menu.add(createMenuItem("Import", controller::importFile));
menu.add(createMenuItem("Clear DB", controller::clearDatabase));
add(menu);
}
public void setController(MenuBarController controller) {
this.controller = controller;
}
}
Run Code Online (Sandbox Code Playgroud)
MenuBarController
是一个接口,其实现是setController
在创建MenuBar之后设置的.代码抛出NullpointerException,menu.add(createMenuItem("Report", controller::writeReport))
只能由此引起controller::writeReport
.如果我用lambda代替它,就像() -> controller.writeReport()
没有NPE 一样.
1.为什么controller::writeReport
抛出NPE?
为什么lambda不投掷NPE?
有趣的部分是:如果我用lambda运行一次后用之前使用的方法引用替换lambda,则不再抛出NPE.
任何人都知道为什么会这样?一些javac/eclipse奇怪吗?