[英]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
ArrayList<RuntimeException>
分配给ArrayList<Exception>
ArrayList<RuntimeException>
,它是否与Java规则冲突? 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.