kaq*_*qao 8 java generics intellij-idea java-8
所以,我制作了这个相对简单的代码,并且我和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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用显式类型将有问题的行拆分为2会有所帮助,但类型签名比lambda长,完全违背了编写lambda的目的......
编辑: 如果我使用实际的lambda而不是方法参考,我再次遇到问题.请参阅上面新添加的方法.
javac
不喜欢那DefaultEdge
是一种原始类型.
return createEdges(nodes, DefaultEdge<N>::new);
Run Code Online (Sandbox Code Playgroud)
将按预期工作.
归档时间: |
|
查看次数: |
185 次 |
最近记录: |