Java泛型疑问:如何返回指定泛型类型的ConcurrentSkipListMap?
正确的泛型方法返回值声明写法
嘿,这个问题我太熟了!你原来的返回值写法犯了Java泛型的语法错误——泛型的类型约束(比如T extends MyObject)必须放在方法的泛型参数列表里,不能直接嵌套在返回值的泛型参数中。
正确的方法声明
你需要把泛型约束<T extends MyObject>移到方法名的前面,然后返回值里直接使用T作为ConcurrentSkipListMap的第二个泛型参数:
class MyObject{} class Human extends MyObject{} // 正确的泛型方法声明 public <T extends MyObject> ConcurrentSkipListMap<String, T> get(Class<T> clazz, Object... vars) { // 方法实现逻辑(这里示例返回一个空集合) return new ConcurrentSkipListMap<>(); } // 调用示例,完全符合预期且无编译错误 ConcurrentSkipListMap<String, Human> mapOfAllAdams = get(Human.class, "Adam");
为什么原来的写法错了?
原代码里的ConcurrentSkipListMap<String, <T extends MyObject>>是无效语法:Java不允许在泛型参数内部再写类型约束,类型约束只能出现在泛型的声明位置(比如方法前的<T extends MyObject>,或者类声明的<T extends MyObject>)。
当你把泛型约束放在方法前,编译器就能根据你传入的Class<T>参数自动推断出T的具体类型(这里就是Human),返回的集合类型自然就匹配你要的ConcurrentSkipListMap<String, Human>啦。
内容的提问来源于stack exchange,提问作者theAnonymous
相关产品推荐
相关产品推荐

