我有以下代码
List<Integer> startnodes = ImmutableList.of(397251,519504,539122,539123,539124,539125);
List<Integer> endnodes = ImmutableList.of(539126,539127,539142,539143,539144,539145);
List<String> rp = ImmutableList.of("Knows","Knows","Knows","Knows2","Knows2","Knows2");
Map<String,Value> parameters =
ImmutableMap.of("rels",ImmutableList.of(startnodes,endnodes,rp));
编译器在最后一行抛出以下错误。
Type mismatch: cannot convert from ImmutableMap<String,ImmutableList<List<?
extends Object&Comparable<?>&Serializable>>> to Map<String,Value>
我的主要困惑是这里的密钥值是异构列表,那么满足编译器的密钥类型应该是什么?我是Java的新手,欢迎任何建议。谢谢!
答案 0 :(得分:2)
ImmutableList.of(startnodes,endnodes,rp)
需要推断出满足List<Integer>
和List<String>
类型的类型,因为Java中的泛型是invariant唯一满足它的类型是List<?>
。所以你可以把它分配给:
List<List<?>> list = ImmutableList.of(startnodes,endnodes,rp);
您的Map
需要定义为:
Map<String,List<List<?>>> parameters = ImmutableMap.of("rels",ImmutableList.of(startnodes,endnodes,rp));
答案 1 :(得分:1)
您可以使用ImmutableList.<Object>of(397251,519504,....)
制作相同类型的列表。通过这种方式,您可以获得同类ImmutableList<ImmutableList<Object>>
,这可能比使用通配符更容易混淆。
但是,这一切都表明List
不是解决问题的正确方法。怎么样创造一个小班级?使用Lombok,你需要
@lombok.Value public class Something {
private final ImmutableList<Integer> startNodes;
private final ImmutableList<Integer> endNodes;
private final ImmutableList<String> rp;
}
如果没有Lombok,你需要写一些样板文件,但这可能还是值得的,因为处理异构列表很痛苦。