Java泛型疑问:为何String无法作为TestMap<T,String>的get方法参数?
泛型参数不匹配问题解析
核心原因
你写的getObj方法里,泛型<T extends Object>的意思是:T可以是任意一个Object的子类,但它是一个确定的具体类型。比如调用这个方法时,传入的TestMap可能是TestMap<Integer, String>(此时T=Integer)、TestMap<Date, String>(T=Date),甚至是自定义类作为键的TestMap<MyClass, String>。
这时候TestMap的get(K k)方法要求传入的参数类型是T,而你传的是String——除非T恰好是String,否则这两个类型完全不兼容。你误以为“T是Object子类,String也是Object子类,所以String能转成T”,但泛型的T是单个具体类型,不是所有Object子类的集合,就像猫和狗都是动物,但不能把狗当猫用。
解决办法
根据你的实际需求,有几种调整方案:
- 仅处理键为String的TestMap:直接去掉泛型,明确指定键类型为String
static String getObj(TestMap<String, String> m, String e) { return m.get(e); } - 兼容键是String或其父类的场景:把泛型约束改为
T super String,这样String可以赋值给T类型参数(子类转父类是合法的)static <T super String> String getObj(TestMap<T, String> m, String e) { return m.get(e); } - 让参数与TestMap键类型一致:把第二个参数的类型改为T,确保传入的参数和TestMap的键类型匹配
static <T extends Object> String getObj(TestMap<T, String> m, T e) { return m.get(e); }
内容的提问来源于stack exchange,提问作者rimrotarorot
相关产品推荐
相关产品推荐

