【发布时间】:2017-02-10 19:27:10
【问题描述】:
我在意想不到的情况下遇到类型不匹配错误。
public interface I {}
public abstract class C {}
public class A extends C implements I {}
public class B extends C implements I {}
public class Foo {
public <T extends C & I> T getComposition(String selector) {
switch (selector) {
case "a": return new A(); // type-mismatch!
case "b": return new B(); // type-mismatch!
}
}
}
为什么A(既是C又是I)不能以T返回?
【问题讨论】:
-
如果我把你的方法称为
foo.<Hello>getComposition(),这个方法应该返回一个Hello的实例,但它返回一个A的实例。 A 扩展了 C & I。T 也可以。但这并不意味着 T 和 A 是同一类。 -
我错过了!谢谢@JBNizet。
-
@JBNizet 这个解释是有道理的,但是你能指出一些关于泛型这方面的进一步阅读吗?至少从我的角度来看,如果这是一个答案,我会赞成;-)
-
@GiovanniLovato,您可以将您的
new A()转换为T并走得更远,但正如 JB Nizet 在下面某处所说,在您的代码中包含此类内容并不好。您能否提供更多详细信息,以便我们为您的真实案例提供帮助? -
@GiovanniLovato 原因是 Test.class 属于 Class
类型。您不能将 Class 类型的引用分配给 Class 类型的变量,因为它们不是同一个东西。