用Java创建异构列表列表

时间:2017-11-06 08:08:33

标签: java guava

我有以下代码

        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的新手,欢迎任何建议。谢谢!

2 个答案:

答案 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,你需要写一些样板文件,但这可能还是值得的,因为处理异构列表很痛苦。