Comparable 接口的泛化

身份接口是多年前在系统中实现的。在这一点上,我们得到了每个身份都应该是可比性的必要性。选项之一是向 Identity 声明添加额外的& 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类将突出显示编译错误:


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


在这种情况下有哪些可能的解决方案?


拉风的咖菲猫
浏览 146回答 1
1回答

精慕HU

更改Identity为您建议的内容后interface Identity<K> extends Comparable<Identity<K>>{}你有两个选择。任何一个:class Handler<T, U extends Identity<T>>{&nbsp; &nbsp; Handler(U value) {&nbsp; &nbsp; &nbsp; &nbsp; Util.handle(value);&nbsp; &nbsp; }}示例用法:Handler<String, Identity<String>> stringHandler = new Handler<>(new FooIdentity());或者class Handler<T>{&nbsp; &nbsp; Handler(Identity<T> value)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Util.handle(value);&nbsp; &nbsp; }}示例用法:final Handler<String> stringHandler = new Handler<>(new FooIdentity());并且Util可以保持不变。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java