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