用Java实例化google集合的BiMap

用Java实例化google集合的BiMap,java,guava,bimap,Java,Guava,Bimap,如何实例化谷歌收藏的Bimap 我已经看过这个问题了 我的代码示例 import com.google.common.collect.BiMap; public class UserSettings { private Map<String, Integer> wordToWordID; UserSettings() { this.wordToWordID = new BiMap<String. Integer>(); import com.google

如何实例化谷歌收藏的
Bimap

我已经看过这个问题了

我的代码示例

import com.google.common.collect.BiMap;

public class UserSettings {

 private Map<String, Integer> wordToWordID;

 UserSettings() {

  this.wordToWordID = new BiMap<String. Integer>();
import com.google.common.collect.BiMap;
公共类用户设置{
私有映射wordToWordID;
用户设置(){
this.wordToWordID=新的BiMap();

我得到
无法实例化类型BiMap

如链接问题中所述,您应该使用
create()
工厂方法

对你来说,这意味着改变

this.wordToWordID = new BiMap<String. Integer>();

是一个接口,因此不能实例化。您需要根据所需的属性实例化一个具体的子类,可用的子类(根据javadoc)是,,。

创建BiMap的另一种很酷的方法,但在本例中是不可变的BiMap,使用
不可变的BiMap.Builder

static final ImmutableBiMap<String, Integer> WORD_TO_INT =
   new ImmutableBiMap.Builder<String, Integer>()
       .put("one", 1)
       .put("two", 2)
       .put("three", 3)
       .build();
static final ImmutableBiMap WORD\u TO\u INT=
新的ImmutableBiMap.Builder()
.put(“一”,1)
.put(“两个”,2)
.put(“三”,3)
.build();

Hmm。你的回答提出了一个新问题。为什么EnumBimap没有像HashBiMap那样没有参数的方法
create
?@Masi:这是一个好问题。我相信原因是EnumBimap需要知道它的参数是什么,并且由于类型擦除,除非你将
对象传递给它,否则它无法知道t某一点。标准库中的
EnumMap
EnumSet
也是如此。因此
EnumMap
只知道类型是不够的。它显然会根据输入数据的内容进行一些处理。@Masi:是的,如果你查看源代码,你会发现
EnumMap
使用
类e> 对象以确定枚举的所有可能值(以及其他内容;您可以在中查看OpenJDK源代码)。
EnumBimap
需要
Class
参数,因为它使用两个
EnumMap
实例(请参见此处的源代码:)。我认为在某些情况下,这甚至比Michael的答案更好。效率是不可变的,没有空值。你认为呢?我认为这项功能是在我问了这个问题之后出现的。这里的手册是javadocs@Masi的道具,我没有想到也把它们放在这里。我猜不可变性和可变性是一个不同的讨论但由于我总是使用不可变对象,我认为至少这种方式值得一提。URL不再是最新的
static final ImmutableBiMap<String, Integer> WORD_TO_INT =
   new ImmutableBiMap.Builder<String, Integer>()
       .put("one", 1)
       .put("two", 2)
       .put("three", 3)
       .build();