【发布时间】:2018-01-30 00:35:38
【问题描述】:
所以,我编写了这个相对简单的代码,我和 IntelliJ IDEA 都没有看到它有什么问题,但是 javac 在标记的行上倒下了,抱怨它无法推断类型:
import java.util.List;
import java.util.stream.Collectors;
public class GenericsBreakJavac8 {
public interface Edge<N> {
N getNode();
}
@FunctionalInterface
public interface EdgeCreator<N, E extends Edge<N>> {
E createEdge(N node);
}
public static <N> List<Edge<N>> createEdges(List<N> nodes) {
return createEdges(nodes, DefaultEdge::new); //the deadly line
}
//THE NEWLY ADDED LINE (see the edit note)
public static <N> List<Edge<N>> createEdges2(List<N> nodes) {
return createEdges(nodes, n -> new DefaultEdge<N>(n));
}
public static <N, E extends Edge<N>> List<E> createEdges(List<N> nodes, EdgeCreator<N, E> edgeCreator) {
return nodes.stream().map(edgeCreator::createEdge).collect(Collectors.toList());
}
public static class DefaultEdge<N> implements Edge<N> {
private final N node;
public DefaultEdge(N node) {
this.node = node;
}
@Override
public N getNode() {
return node;
}
}
}
使用显式类型将有问题的行分成 2 行会有所帮助,但类型签名比 lambda 长,完全违背了最初编写 lambda 的目的......
编辑: 如果我使用实际的 lambda 而不是方法引用,我会再次遇到问题。见上面新增的方法。
【问题讨论】:
标签: java generics intellij-idea java-8