如何初始化实现Comparable接口的泛型类以规避原始类型使用
解决方案
你的核心需求是在不修改Unit类的前提下,消除调用代码中的“Raw use of parameterized class”警告,同时保留compareTo()方法的可用性。可以通过指定具体的泛型类型Comparable<?>来实现:
修改后的调用代码
Unit<Comparable<?>> unit1 = new Unit<>(); Map<String, Comparable<?>> params = new HashMap<>(); params.put("First", 123); params.put("Second", "ABS"); params.put("Third", 'a'); unit1.setParams(params); // 正常调用compareTo方法 Unit<Comparable<?>> unit2 = new Unit<>(); unit1.compareTo(unit2);
为什么这样可行
- 泛型约束匹配:
Comparable<?>满足Unit类的泛型约束V extends Comparable<? super V>——所有实现Comparable接口的类型(如Integer、String、Character)都可以向上转型为Comparable<?>,而Comparable<?>的超类型包含Object,符合Comparable<? super V>的要求。 - 消除原始类型警告:明确指定
Unit的泛型类型为Comparable<?>,不再使用原始类型Unit,同时Map的泛型也改为Comparable<?>,避免了未指定泛型的警告。 - 保留compareTo可用性:
Unit<Comparable<?>>实现了Comparable<Unit<Comparable<?>>>,因此可以正常调用compareTo()方法,参数类型完全匹配。
为什么之前的通配符尝试会失败
如果使用Unit<?>或Unit<? extends Comparable<?>>这类通配符声明,编译器无法确定Unit的具体泛型类型,导致compareTo()方法的参数类型(需要Unit<V>)无法匹配,从而编译报错。而明确指定V为Comparable<?>则解决了这个类型不确定性问题。
内容的提问来源于stack exchange,提问作者youngMYN
相关产品推荐
相关产品推荐

