我有以下几点:
interface Foo<T> {
//... lines [0,45]...
/*line 46*/ <R, X super T&R> List<X> weave(R value);
//...
}
但是IntelliJ正在报道:
有什么问题?我不允许将名字绑定到下限吗?或者我只允许在上限中使用R&X
表达式?
将其更改为
interface Foo<T> {
//... lines [0,45]...
/*line 46*/ <R> List<? super T&R> weave(R value);
//...
}
产量
答案 0 :(得分:3)
通过阅读规范,super
只能与通配符一起使用,不能被捕获到类型变量中;见JLS 4.5.1。同样,&
仅在类型变量中有效,而不是类型参数,类型变量不能使用super
。
在考虑之后,我的解释如下:类型变量的原因是消除显式转换以提高类型安全性。当您将类型参数声明为super Foo
时,您可以说该参数可以是 Foo
的任何超类。这意味着它可以是包括Object
在内的任何内容,因此您没有安全的方法来假设其类型满足该范围的对象的任何内容,因此没有任何包含在命名中的信息。类型变量;你只是通配了它,可以拨打hashCode()
或toString()
,但没有特定类型。