在我不期望的情况下,我遇到了类型不匹配错误。
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
?
答案 0 :(得分:4)
符号<T extends C & I>
表示T
是类型参数。这意味着当有人调用该函数时,他们必须指定此类型。唯一的限制是类型扩展为C
和I
。 A
就是这样一种类型,但我可以创建一个同样扩展C
和I
的新类。像这个例子:
class B extends C implements I {}
Foo foo = new Foo();
B b = foo.<B>getComposition();
如果您的示例已编译,则会导致异常,因为A
与B
的类型不同。
如果您确实只想返回A
,则需要删除泛型参数并直接返回类型A
。像这样:
public class Foo {
public A getComposition() {
return new A();
}
}
答案 1 :(得分:1)
你是对的但只是一部分。 A或B是T,绝对正确。但是T本身根本不是A或B.例如。我有另一个叫D的类,D扩展A.所以,D也是T.如果你说T是A,你也意味着D是A.这根本不正确,因为D是A的子类型。