我在意想不到的情况下遇到了类型不匹配错误。
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
返回?
最佳答案
符号<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();
}
}
关于java - 在 Java 中组合泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157034/