可变长度泛型类型

时间:2013-08-16 07:08:37

标签: java generics

我想做这样的事,有人做过类似的事吗? 我有一个解决方案图有两个键,我用它来进行地理定位,但我想用n个键来代替它。

import java.util.Collection;
import java.util.Set;

public interface NKeyMap<K..., V> {
    public void clear();
    public boolean containsKey(K...);
    public boolean containsValue(V value);
    public V get(K...);
    public boolean isEmpty();
    public V put(K..., V value);
    public V removeK..., V value);
    public int size();
    public Collection<V> values();
    public Set<K...> keys();
}

3 个答案:

答案 0 :(得分:2)

看看这个post该人试图通过链接pair

来模拟这个

他这样做

Pair<String, Integer> pair = Pairs.pair("hello", 5);
Pair<Double, Pair<String, Integer>> withDouble = Pairs.pair(3.0, pair);

并建议以下使其更清洁

public class Pair<T, U> { ...
  public <V> Pair<V, Pair<T, U>> prepend(V v) {
   return pair(v, this); } }

这样就变成了

Pair<Double, Pair<String, Integer>> pair = Pairs.pair("hello", 5).prepend(3.0);

注意:您可能需要写Pair

注意:他似乎最终支持javatuples ..

更相关:

阅读完评论后,这个更明显的解决方案呈现出来。 多维地图,就像多维数组一样

Map<XKey, Map<YKey, Value> >

答案 1 :(得分:2)

你不能做var-arg泛型,但你可以做类似下面的事情

import java.util.Collection;
import java.util.Set;

public interface NKeyMap<K, V> {
public void clear();
public boolean containsKey(K... k );
public boolean containsValue(V value);
public V get(K... k);
public boolean isEmpty();
public V put(V value, K...k);
public V remove(V value, K... k);
public int size();
public Collection<V> values();
public Set<K> keys();
}

答案 2 :(得分:1)

如果你需要可变长度的密钥,你可以使用javatuples或类似的东西,它包含任意数字和任意类型的参数(它们提供元组直到10的长度):

Map<Triplet<Double,Float,Integer>, Object> mapWithCombinedKeys = ...