繁体   English   中英

为什么编译器会这样表现?

[英]Why does compiler behave like this?

看,我们有代码:

public class Test2 {
    public static void main(String... args) {
        ArrayList<Exception> a = new ArrayListFactory().create(new RuntimeException());
        ArrayList<Exception> b = new ArrayListFactory().create("Z");
        }
}

class ArrayListFactory {
    public <T> ArrayList<T> create(T example) {
        return new ArrayList<T>(10);
    }
}

以及第二条语句的编译错误:

Error:(15, 63) java: incompatible types: inference variable T has incompatible bounds
    equality constraints: java.lang.Exception
    lower bounds: java.lang.String
  1. 实际上,第一条语句将另一个ArrayList<RuntimeException>分配给ArrayList<Exception> ArrayList<RuntimeException> ,它是否与Java规则冲突?
  2. 第二条语句推断create Exception类型参数。 它是否检查方法的返回类型是否与ArrayListFactory类中定义的参数类型相匹配? 看来应该动态地解决此方法调用,为什么编译器确定它正在处理正确的方法?

所有泛型类型都将在编译时进行分配,因此编译器将从您的分配及其预期的类型中推断出类型,但在您的情况下,它们是不同的,因此它将产生类型不匹配错误,请更改此类代码以修复错误。

public class Test2 {

    public static void main(String... args) {
        ArrayList<RuntimeException> a = new ArrayListFactory().create(new RuntimeException());
        ArrayList<String> b = new ArrayListFactory().create("Z");  
        }
}

在此语句中:

ArrayList<Exception> b = new ArrayListFactory().create("Z");

编译器使用类型推断(来自声明ArrayList<Exception> )对create()的通用返回类型添加约束。 这称为目标类型 表达式的目标类型是Java编译器期望的数据类型,具体取决于表达式出现的位置。

在这种情况下,T应该是Exception的子类。 因此, RuntimeException很好。 String不是。

此功能随Java 8一起出现。有关更多信息,请参见: http : //docs.oracle.com/javase/8/docs/technotes/guides/language/enhancements.html

1)首次通话

    ArrayList<Exception> a = new ArrayList<RuntimeException>();

不是Java中泛型的合法使用。 您可以转到“获取原理”的说明进行理解。

2)二次通话

T类型的推论取决于从调用方声明的返回类型。

在这里,调用者将返回的类型声明为Exception

 ArrayList<Exception> b = new ArrayListFactory().create("Z");

而编译错误:

错误:(15,63)java:不兼容类型:推断变量T具有不兼容

边界相等约束:java.lang.Exception

传递字符串:

 ArrayList<String> b = new ArrayListFactory().create("Z");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM