我有一些类似的东西:
interface Foo<T> {
//... lines [0,45]...
/*line 46*/ <R, X super T&R> List<X> weave(R value);
//...
}
但是 IntelliJ 正在报告:
- 错误:(46, 18) java: > 预期
- 错误:(46, 19) java: 类型的非法开始
- 错误:(46, 26) java: '(' 预期
- 错误:(46, 28) java:<标识符> 预期
- 错误:(46, 29) java:应为“l”
- 错误:(46, 43) java:<标识符> 预期
有什么问题?我不允许将名称绑定(bind)到下限吗?还是只允许在上限中使用 R&X
表达式?
将其更改为
interface Foo<T> {
//... lines [0,45]...
/*line 46*/ <R> List<? super T&R> weave(R value);
//...
}
产量
- 错误 (46, 31) java: > 预期
- 错误 (46, 32) java: '(' 预期
- Error(46, 33) java: 类型的非法开始
最佳答案
根据我对规范的阅读,super
只能与通配符一起使用,不能捕获到类型变量中;见JLS 4.5.1 .同样,&
只在类型变量中有效,类型arguments无效,类型变量不能使用super
.
经过思考,我的解释是:类型变量的原因是为了消除显式转换以提高类型安全性。当您将类型参数声明为 super Foo
时,您是说该参数可以是 Foo
的任何父类(super class)。这意味着它可以是 Object
之前的任何内容,包括 Object
,因此您没有安全的方法来假设关于其类型满足该绑定(bind)的对象的任何内容,因此命名类型中不包含任何信息多变的;您只需对它进行通配符,然后就可以调用 hashCode()
或 toString()
,但没有类型特定的内容。
关于java - "Unexpected token"使用下界通配符 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18157318/