可比接口的一般化

时间:2018-10-03 15:28:37

标签: java comparable

身份接口是在几年前在系统中实现的。在这一点上,我们有必要使每个身份都具有可比性。选项之一是向身份声明添加其他&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 )来增强大量代码。 更为优雅的解决方案是使用身份一来扩展Comparable接口:

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

}

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

  

错误:接口Util中的方法句柄无法应用于给定   类型;必需:T#1找到:T#2原因:显式类型参数T#2   不符合声明的界限比较T#1,T#2   是类型变量:T#1扩展了在方法中声明的Comparable   handle(T#1)T#2扩展了在Handler类中声明的Identity

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

1 个答案:

答案 0 :(得分:1)

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可以保持不变。