我在意想不到的情况下遇到了类型不匹配错误。
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!
}
}
}为什么既是C又是I的A不能作为T返回
发布于 2017-02-10 18:32:58
符号<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();
}
}发布于 2017-02-10 19:27:10
你是对的,但这只是一部分。A或B是T,这是绝对正确的。但T本身根本不是A或B。例如,我有另一个叫做D的类,D扩展了A,所以D也是T。如果你说T是A,你也意味着D是A。这是完全不正确的,因为D是A的一个子类型。
https://stackoverflow.com/questions/42157034
复制相似问题