java - "Unexpected token"使用下界通配符 (Java)

标签 java generics syntax-error bounded-wildcard

我有一些类似的东西:

interface Foo<T> {
    //... lines [0,45]...

/*line 46*/ <R, X super T&R> List<X> weave(R value);
    //...
}

但是 IntelliJ 正在报告:

  1. 错误:(46, 18) java: > 预期
  2. 错误:(46, 19) java: 类型的非法开始
  3. 错误:(46, 26) java: '(' 预期
  4. 错误:(46, 28) java:<标识符> 预期
  5. 错误:(46, 29) java:应为“l”
  6. 错误:(46, 43) java:<标识符> 预期

有什么问题?我不允许将名称绑定(bind)到下限吗?还是只允许在上限中使用 R&X 表达式?

将其更改为

interface Foo<T> {
    //... lines [0,45]...

/*line 46*/ <R> List<? super T&R> weave(R value);
    //...
}

产量

  1. 错误 (46, 31) java: > 预期
  2. 错误 (46, 32) java: '(' 预期
  3. 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/

相关文章:

Java 泛型和通配符 : How to make this code compile?

Android 通用用户代理 (UA)

awk 语法错误 a[$1]

Java 打包和导入 - 我的错误在哪里?

java - Spring websocket 与rabbitmq - 在订阅级别添加安全性

java - 如何运行具有不同包层次结构中子类的类的Java程序?

java - 如何修复 Java 中的 Kafka 错误 "IOException caught when establishing connection to https://stream.twitter.com"?

java - 在 Java 中映射泛型

eclipse - tomcat和java SDK问题

java - 循环内变量声明与同一变量名的多个声明