Comparable接口的泛化

Generalization of Comparable interface

身份接口是几年前在系统中实现的。在这一点上,我们得到了每个身份都应该是可比较的必要性。一种选择是向身份声明添加额外的 & Comparable 类型:

interface Identity<K> {

}

class Handler<T extends Identity<?> & Comparable<T>> {

  Handler(T value) {
    Util.<T>handle(value);
  }
}

class Handler2<T extends Identity<?> & Comparable<T>> {

  Handler2(T value) {
    Util.<T>handle(value);
  }
}

interface Util {

  static <T extends Comparable<T>> void handle(T value) {
  }
}

主要缺点之一是需要使用相同的信息来增强大量代码(例如 & Comparable)。 更优雅的解决方案是使用 Identity one 扩展 Comparable 接口:

interface Identity<K> extends Comparable<Identity<K>>{

}

但在这种情况下 Handler class 将突出显示编译错误:

error: method handle in interface Util cannot be applied to given types; required: T#1 found: T#2 reason: explicit type argument T#2 does not conform to declared bound(s) Comparable where T#1,T#2 are type-variables: T#1 extends Comparable declared in method handle(T#1) T#2 extends Identity declared in class Handler

在这种情况下可能的解决方案是什么?

Identity 更改为您建议的内容后

interface Identity<K> extends Comparable<Identity<K>>{

}

你有两个选择。或者:

class Handler<T, U extends Identity<T>>
{
    Handler(U value) {
        Util.handle(value);
    }
}

示例用法:

Handler<String, Identity<String>> stringHandler = new Handler<>(new FooIdentity());

class Handler<T>
{
    Handler(Identity<T> value)
    {
        Util.handle(value);
    }
}

示例用法:

final Handler<String> stringHandler = new Handler<>(new FooIdentity());

Util可以保持不变。