当前位置: 首页 > 面试题库 >

如何使用泛型变量声明地图?

乜栋
2023-03-14
问题内容

我有一个Map其键为通用类型Key<T>,而值为类型List<T>。如果键是的实例Key<String>,则值必须是List<String>,并且相同的规则适用于任何其他键值对。我尝试了以下方法,但无法编译:

Map<T, List<T>> map;

目前,我必须使用“部分”泛型进行声明:

Map<Object, List> map;

我知道这很糟糕,但是我目前没有更好的选择。在这种情况下可以使用泛型吗?

更新

也许我没有明确表达我的问题。我想要一张能够:

map.put(new Key<String>(), new ArrayList<String>());
map.put(new Key<Integer>(), new ArrayList<Integer>());

并且以下代码不应编译:

map.put(new Key<String>(), new ArrayList<Integer>());

键和值应始终具有相同的泛型类型,而泛型类型可以是任意泛型,并且显然扩展地图不符合我的要求。


问题答案:

我不知道任何现有的库都可以精确地做到这一点,但是实现自己并不难。我过去做过几次类似的事情。您不能使用标准的Map接口,但是可以在内部使用哈希映射来实现您的类。首先,它可能看起来像这样:

public class KeyMap {
  public static class Key<T> { }

  private final HashMap<Object,List<?>> values = new HashMap<Object,List<?>>();

  public <T> void put(Key<T> k, List<T> v) {
    values.put(k, v);
  }

  public <T> List<T> get(Key<T> k) {
    return (List<T>)values.get(k);
  }

  public static void main(String[] args) {
    KeyMap a = new KeyMap();
    a.put(new Key<String>(), new ArrayList<String>());
    a.get(new Key<Integer>());
  }
}


 类似资料:
  • 我有一个类用复数来计算,一个实部和一个虚部作为双类型。在其他部分,我有一个rational类来计算有理数。现在我想让我的复形类能在实部和虚部是有理数的情况下运算。我读过一些关于泛型的文档,但我不知道如何将实部和虚部声明为泛型类型,以及当实部和虚部是双倍或有理时如何使用添加2复数的方法。这是我的测试代码: 如果您看到了我实现了2个add方法的代码,但我只想要一个,因此对于其他方法,也需要toStri

  • 问题内容: 注意:纯粹出于好奇而不是用于任何实际用例。 我想知道是否有一种方法可以 使用有效的类型参数声明对象: 如果和是可以互换的,为什么和不呢? 编辑: 问题可以推广到嵌套原始类型参数的问题。例如: 编辑2: 我应该稍微改一下这个问题:我知道 是有效的,但我想知道为什么与 问题答案: 泛型有一些相当严重的局限性。在这种情况下,您不能将类型分配给内部类型,因为您实际上是在引用原始类型,而不是原始

  • react用vite搭建的项目 想要做代码提示,必须声明variables的类型,不想再像下面这样写一遍。 想直接根据scss中定义的变量生成类型声明,要怎么做?类似 但是因为variables是个cssmodule,而不是个具体的对象,上面的写法还是不行? 有没有好的方式解决?

  • 我需要创建一个新的JComboBox,但是由于我对三个不同的操作使用相同的JFrame,我需要将JComboBox名称作为参数传递 这是我现在拥有的代码: 如果我打印comboTipo,我可以阅读“Tienda.telasItems”或“Tienda.accesoriosItems”或“Tienda.aviosItems”。我希望在组合框声明中使用此文本,这样就不必创建决策结构 如果需要更多信息,

  • 请考虑以下代码: 在foo中,的类型将是。 我想在中创建一个变量,它的类型是的泛型,在本例中是。 有没有办法做到这一点?谢谢。 编辑不幸的是(我想)我无法重写签名,因为函数是用不同类型的对象调用的,例如

  • 问题内容: 我偶然发现了一个奇怪的问题,下面的代码无法编译: 错误(代码是linter推荐的代码)。: 注意,确实使用了该变量。 但是,如果我添加了else块-一切都会按预期编译: 这看起来像是编译器中的错误,还是一个已知问题?任何想法?(我正在使用go 1.11) 编辑:到目前为止的所有被告。按照:https : //golang.org/ref/spec#Short_variable_decl