java - 如何重现可能不是两个参数接口(interface)的子类型的通用接口(interface)类型变量的 java 编译/运行时错误?

标签 java generics specifications java-6

我正在阅读Java SE 6 specs然后发现了一些我无法重现的令人困惑的东西:

A type variable may not at the same time be a subtype of two interface types which are different parameterizations of the same generic interface.

我编写了以下代码:

interface Odd {}

interface Even {}

interface Strange extends Odd, Even {}

interface InterfaceOne<O extends Odd, E extends Even> {}

interface InterfaceTwo<O extends Odd, E extends Even> extends Odd, Even {}

public class Test {
    public static void main(String[] args) {
        //Expecting compilation error
        InterfaceOne<Strange, Strange> t1 = new InterfaceOne<Strange, Strange>(){};
        //Expecting compilation error
        InterfaceTwo<Strange, InterfaceTwo> t2 = new InterfaceTwo<Strange, InterfaceTwo>(){};
        System.out.println("" + t1 + t2);
    }
}

上面的代码应该无法编译,但它确实可以编译。

如何重现规范预测的错误?

最佳答案

据我了解,泛型类型不能绑定(bind)到两个或多个接口(interface),其中这些接口(interface)从使用泛型参数的另一个接口(interface)扩展,并且绑定(bind)的接口(interface)对泛型使用不同的类型。我写了一个这样的例子:

interface Simple<T> { T aMethod(); }
interface SimpleString extends Simple<String> {}
interface SimpleInteger extends Simple<Integer> {}
public class CompilerError {
    public <T extends SimpleString & SimpleInteger> void here(T interesting) {
        System.out.println(interesting.aMethod());
    }
}

使用 javac 1.6.0_32-ea,这给我带来了以下编译器错误

CompilerError.java:5: Simple cannot be inherited with different arguments: <java.lang.String> and <java.lang.Integer>
        public <T extends SimpleString & SimpleInteger> void here(T interesting) {
                ^
1 error

关于java - 如何重现可能不是两个参数接口(interface)的子类型的通用接口(interface)类型变量的 java 编译/运行时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32232734/

相关文章:

html - 文档正文中的 meta、link 和 style 元素有什么用途?

java - 如何确定哪个java实例加载了类

java - 使用多个接口(interface)的最佳方式是什么?

java - 是否可以编写一个泛型函数来提取泛型对象中的对象?

参数的java通用类型与抽象类

c# - 规范中是否实现了自动属性?

ruby - 我怎样才能摆脱以下警告 : Problem while setting context on example startundefined local variable or method `selenium_driver'

java - 在 printStackTrace() 上打印完整的调用堆栈?

最终好奇的Java未初始化变量

java - Hive 元存储遭受 kerberos "Clock skew too great"错误