如何在Java中比较泛型类MyClass的不同泛型实例化对象?
解决方案
要实现跨不同泛型参数的MyClass实例按计数器比较,你需要放弃依赖Comparable的类型绑定,改用**通用的Comparator**来实现,具体步骤如下:
1. 给MyClass添加计数器属性及访问方法
首先确保你的类里有计数器字段和对应的get方法:
class MyClass<T extends Comparable<T>> implements Comparable<MyClass<T>> { private int counter; // 其他属性、构造方法... public int getCounter() { return counter; } // 原来的compareTo实现,仅用于同泛型类型的比较 @Override public int compareTo(MyClass<T> o) { // 原逻辑,比如基于T的比较 return this.someTValue.compareTo(o.someTValue); } }
2. 实现通用的计数器比较器
在MyClass内部定义一个静态的Comparator,通配符?表示它可以接受任意泛型参数的MyClass实例:
class MyClass<T extends Comparable<T>> implements Comparable<MyClass<T>> { // 其他代码... // 静态比较器:仅按counter字段比较,无视泛型参数 public static final Comparator<MyClass<?>> BY_COUNTER = (obj1, obj2) -> { return Integer.compare(obj1.getCounter(), obj2.getCounter()); }; }
3. 使用比较器进行跨泛型比较
在需要比较不同泛型的MyClass实例时,直接调用这个静态比较器的compare方法:
public static void main(String[] args) { MyClass<MyClass<Integer>> intNested = new MyClass<>(); intNested.counter = 5; // 假设可以直接赋值,或通过构造/set方法设置 MyClass<MyClass<String>> strNested = new MyClass<>(); strNested.counter = 10; // 跨泛型比较,结果为-1,因为5<10 int compareResult = MyClass.BY_COUNTER.compare(intNested, strNested); }
为什么不用原有的Comparable?
原Comparable<MyClass<T>>的类型约束要求比较的两个实例必须是同泛型参数的MyClass<T>,而MyClass<MyClass<Integer>>和MyClass<MyClass<String>>属于不同的参数化类型,编译阶段就会拒绝用compareTo直接比较。而Comparator是独立于类自身类型绑定的比较逻辑,刚好能满足这种跨类型比较的需求。
内容的提问来源于stack exchange,提问作者kesarling
相关产品推荐
相关产品推荐

