Java有界泛型:类型推断错误?(方法调用,JLS 15.12.2.7)

用户508633:

对于以下代码段:

import java.util.List;

public class Main {
    interface Interface1<T> {}
    interface Interface2<T> extends Interface1<T> {}
    static class Bound {}
    interface BoundedI1<T extends Bound> extends Interface1<T> {}
    interface BoundedI2<T extends Bound> extends Interface2<T> {}

    public static void main(String[] args) {
        test((List<BoundedI2<?>>) null);
        //test2((List<BoundedI2<?>>) null);
    }

    public static void test(List<? extends Interface2<? extends Bound>> list) { test2(list); }

    public static void test2(List<? extends Interface1<? extends Bound>> list) {}
}

编译器可以进行第一个调用,但是如果我不评论第二个则抱怨。这是类型推断系统中的错误,还是有人可以解释为什么JLS中的推断规则在这里失败?

在6u43和7u45 Oracle JDK上都进行了测试。

更新:好像eclipsec接受它就好了。不幸的是,我无法真正改变我们的工具链:P,但是在编译器中发现差异很有趣。

错误消息,由ideone(酷工具btw)打印:

Main.java:12: error: method test2 in class Main cannot be applied to given types;
        test2((List<BoundedI2<?>>) null);
        ^
  required: List<? extends Interface1<? extends Bound>>
  found: List<BoundedI2<?>>
  reason: actual argument List<BoundedI2<?>> cannot be converted to List<? extends Interface1<? extends Bound>> by method invocation conversion

更新2:可以很好地进行编译,这表明编译器确实认为BoundedI2<?>可分配给Interface1<? extends Bound>,这似乎与JLS更直接矛盾:

public class Main {
    interface Interface1<T> {}
    interface Interface2<T> extends Interface1<T> {}
    static class Bound {}
    interface BoundedI1<T extends Bound> extends Interface1<T> {}
    interface BoundedI2<T extends Bound> extends Interface2<T> {}

    public static void main(String[] args) {
        test((List<BoundedI2<?>>) null);
        //test2((List<BoundedI2<?>>) null);
        test3((BoundedI2<?>) null);
    }

    public static void test(List<? extends Interface2<? extends Bound>> list) { test2(list); }

    public static void test2(List<? extends Interface1<? extends Bound>> list) {}
    public static void test3(Interface1<? extends Bound> instance) {}
}
埃里克·尼古拉斯(Eric Nicolas):

看起来命令行编译器在同时处理方面有些困难

  • BoundedI2在T上是通用的,它必须是“ Bound”
  • Interface2正在扩展Interface1的事实

至少没有正确说明BoundedI2。确实奇怪的是,在同一个JDK上配置的Eclipse可以很好地进行编译...请注意,Eclipse使用它的内部编译器来处理您键入时的增量重新计算,因此它根本不会调用JDK的编译器(请参阅org / eclipse / jdt / internal / compiler包)。

通过强制将BoundedI2设置为具体类型而不是类型推断,此修改使其可以在Eclipse和命令行中正常编译:

import java.util.List;

public class PerfTest {
    interface Interface1<T> {}
    interface Interface2<T> extends Interface1<T> {}
    static class Bound {}
    interface BoundedI1<T extends Bound> extends Interface1<T> {}
    interface BoundedI2<T extends Bound> extends Interface2<T> {}
    static class Actual extends Bound {}

    public static void main(String[] args) {
        test((List<BoundedI2<Actual>>) null);
        test2((List<BoundedI2<Actual>>) null);
    }

    public static void test(List<? extends Interface2<? extends Bound>> list) { test2(list); }

    public static void test2(List<? extends Interface1<? extends Bound>> list) {}
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

打印12月年和使用Java未来2年

泛型中的有界类型

Java 7泛型类型推断:返回值与方法参数

带有有界通配符的泛型类型的Java泛型集合

Java泛型:将无界类型转换为有界类型

Java / Scala有界泛型和类型推断不匹配

无法从TemporalAccessor获取OffsetDateTime:2016-12-15T15:58:03Z类型为java.time.Instant

2您不能在FROM子句SQL2.sql中为更新指定目标表'p'7 15

Java通配符有界泛型

Java 7泛型:如何访问泛型类型的方法?

如何以12:07而非12:7的格式显示时间?

postgres我得到了一组数字,例如“ 1,2,3,6,7,8,11,12,15,18,19,20”,以获得每组连续数字的最大值

Javascript:根据模式拆分数组:项1、5、10、2、6、11、3、7、12

Windows 7上具有12GB RAM的硬故障

urxvt粗体颜色错误-粗体#0-7使用的是#8-15中的颜色

使用Java7的Weblogic 12不会在JAXBElement中设置nill

css第n个孩子选择器,用于孩子2、3、6、7、10、11、14、15等

SATA是7针还是15针?

如何使用Java8 Date API将“ 2009年12月15日”解析为Date?

值错误:无法为形状为“(5, 15, 2)”的张量“one_hot:0”提供形状 (5, 15) 的值

如果display(15)我想要结果1,2,3,4,5,6,8,9,10,12,15,16,18,20,24

添加 15 分钟到 12 小时的时间格式

资源 7bed8adc-9ed9-49dc-b15e-6660e2fc3285 在使用 openstacksdk 到 create_server 时转换到故障状态错误

在 Windows 7 上使用 Java SE DK 10.0.01 安装 Oracle SOA Suite 12c

从 2 到 N 的给定数字应该使每个数字可整除输出为 [(2,4), (2,6),( 2,8),( 3,9),( 3,12), (3,15) .....] 在 Python 2/3 中

Odoo:Odoo 12 中等效的 OpenERP7 _prepare_purchase_order_line 方法

Nodejs、Mongoose 无法上传到 Heroku,错误代码为 H12、H15。怎么修?

识别向量的第一次出现,其中 15 个值中有 12 个为 1

有没有办法使用 Xcode 12.x 构建 iOS 15 应用程序?