0

我正在寻找实现某个接口的对象集合,但我希望集合中的每个具体类型只有一个。

collection of implementers of dog:
 - instance of dachshund
 - instance of beagle
 - instance of corgi

在 .NET 中,有一个“KeyedByTypeCollection”。Java中是否存在类似的东西,我可以在Android上使用它?

谢谢!

4

4 回答 4

2

如果你愿意使用第三方库——而且你不关心维护秩序——Guava ClassToInstanceMap似乎适用于此。

ClassToInstanceMap<Dog> map = MutableClassToInstanceMap.create();
map.putInstance(Corgi.class, new Corgi("Spot"));
map.putInstance(Beagle.class, new Beagle("Lady"));
Corgi corgi = map.getInstance(Corgi.class); // no cast required

(披露:我为 Guava 做出了贡献。)

于 2012-06-26T14:28:22.910 回答
1

你应该看看泛型。例如: List<Dogs> dogList = new ArrayList<Dogs>();

编辑:要在您的集合中只有唯一实例,您应该使用Set<Dogs> dogList = new HashSet<Dogs>();

于 2012-06-26T13:45:22.077 回答
0

我认为您需要一个自定义的 HaspMap 来维护具有相同键的多个值,

因此,创建一个简单的类来扩展 HashMap 并将值放入其中。

public class MyHashMap extends LinkedHashMap<String, List<String>> {

    public void put(String key, String value) {
        List<String> current = get(key);
        if (current == null) {
            current = new ArrayList<String>();
            super.put(key, current);
        }
        current.add(value);
    }
}

现在,创建 MyHashMap 的实例并将值放入其中,如下所示,

        MyHashMap hashMap = new MyHashMap();
        hashMap.put("dog", "dachshund");
        hashMap.put("dog", "beagle");
        hashMap.put("dog", "corgi");
        Log.d("output", String.valueOf(hashMap));

输出

{dog=[dachshund, beagle, corgi]}
于 2012-06-26T13:45:54.083 回答
0

这可能是您正在寻找的:查看代码中的注释

// two Dog(interface) implementations
        // Beagle, Dachshund implements Interface Dog.
        final Dog d1 = new Beagle();
        final Dog d2 = new Dachshund();

        // here is your collection with type <Dog>
        final Set<Dog> set = new HashSet<Dog>();
        set.add(d1);
        set.add(d2);

        // see output here
        for (final Dog d : set) {
            System.out.println(d.getClass());
        }

        // you can fill them into a map
        final Map<Class, Dog> dogMap = new HashMap<Class, Dog>();
        for (final Dog d : set) {
            // dog instances with same class would be overwritten, so that only one instance per type(class)
            dogMap.put(d.getClass(), d); 
        }

system.out.println 行的输出类似于:

class test.Beagle
class test.Dachshund
于 2012-06-26T13:54:28.627 回答