【问题标题】:To instantiate BiMap Of google-collections in Java在 Java 中实例化 google-collections 的 BiMap
【发布时间】:2010-03-11 21:49:21
【问题描述】:

如何实例化 Google 集合的 Bimap

我已阅读问题Java: Instantiate Google Collection's HashBiMap

我的代码示例

import com.google.common.collect.BiMap;

public class UserSettings {

 private Map<String, Integer> wordToWordID;

 UserSettings() {

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

我收到cannot instantiate the type BiMap&lt;String, Integer&gt;

【问题讨论】:

    标签: java guava bimap


    【解决方案1】:

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

    在你的情况下,这意味着改变

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

    this.wordToWordID = HashBiMap.create(); 
    

    【讨论】:

    • 嗯。你的回答提出了一个新问题。 为什么EnumBimap没有像HashBiMap这样的不带参数的方法create
    • @Masi:这是个好问题。我相信原因是因为 EnumBimap 需要知道它的参数是什么,并且由于类型擦除,除非您在某个时候将 Class 对象传递给它,否则它无法知道。标准库中的EnumMapEnumSet 也是如此。
    • 所以EnumMap 只知道类型是不够的。它显然会根据输入数据的内容进行一些处理。
    • @Masi:是的,如果您查看源代码,您可以看到EnumMap 使用Class 对象来确定枚举的所有可能值是什么(以及其他事情;您可以在openjdk.dev.java.net/source/browse/openjdk/jdk/trunk/jdk/src/… 处查看 OpenJDK 源代码)。 EnumBimap 需要 Class 参数只是因为它使用了两个 EnumMap 实例(请参阅此处的源代码:code.google.com/p/google-collections/source/browse/trunk/src/…)。
    【解决方案2】:

    BiMap 是一个接口,因此无法实例化。你需要根据你想要的属性实例化一个具体的子类,可用的子类(根据javadoc)是EnumBiMapEnumHashBiMapHashBiMapImmutableBiMap

    【讨论】:

    • 网址不再是最新的
    【解决方案3】:

    创建 BiMap 的另一种很酷的方法是使用 ImmutableBiMap.Builder

    static final ImmutableBiMap<String, Integer> WORD_TO_INT =
       new ImmutableBiMap.Builder<String, Integer>()
           .put("one", 1)
           .put("two", 2)
           .put("three", 3)
           .build();
    

    http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/ImmutableBiMap.html

    【讨论】:

    • 我认为这在某些情况下甚至比迈克尔的回答还要好。不可变的效率,没有空值。你怎么看?我认为这个功能是在我提出问题后出现的。手册在这里docs.guava-libraries.googlecode.com/git/javadoc/com/google/…
    • javadocs @Masi 的道具,我没想到也把它们放在这里。我想 Immutability vs. Mutability 是一个不同的讨论,但由于我总是使用不可变对象,我只是认为至少这种方式值得一提。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2018-12-13
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多