关于Java泛型的几个问题
假设我有以下接口和实现类:关于Java泛型的几个问题,java,generics,type-mismatch,Java,Generics,Type Mismatch,假设我有以下接口和实现类: interface Foo<FooType extends Foo<FooType>> { FooType copy(); } class Bar implements Foo<Bar> { public Bar copy() { return new Bar(); } } 我得到以下编译错误: Bound mismatch: The generic method print
interface Foo<FooType extends Foo<FooType>> {
FooType copy();
}
class Bar implements Foo<Bar> {
public Bar copy() {
return new Bar();
}
}
我得到以下编译错误:
Bound mismatch: The generic method printFoo(FooType) is not applicable
for the arguments (Foo<Foo<FooType>>). The inferred type Foo<Foo<FooType>>
is not a valid substitute for the bounded parameter <FooType extends Foo<FooType>>
绑定不匹配:通用方法printFoo(FooType)不适用
对于参数(Foo)。推断类型Foo
不是有界参数的有效替代项
WAT?getFoo()的返回类型与printFoo()的参数类型完全相同
这些是错误还是我遗漏了什么?问题是
FooType
可以是任何东西,而不仅仅是Bar
。您可以返回FooType
的实例
e、 如果你有类NotBar实现Foo{
,那么
obj.<NotBar>getFoo();
obj.getFoo();
现在
FooType
的实际参数是NotBar
问题在于,使用您声明的方法:
public <FooType extends Foo<FooType>> FooType doGetFoo()
明白了!感谢meriton回答了这个问题: 我需要通过执行以下操作,逐步完成编译器的
printFoo(getFoo())
-部分:
public <FooType extends Foo<FooType>> void doPrint() {
FooType foo = getFoo();
printFoo(foo);
}
public void doPrint(){
FooType foo=getFoo();
printFoo(foo);
}
然后调用doPrint()
然后一切正常
<> P>那么,我想即使中间的“为什么”可能是我缺乏理解力(感谢BHHH来清除那部分),最后的“WAT”是有道理的,因为这真的应该起作用……例如,不可以,出于某种原因,将变量定义内嵌为“FO”。在上面的代码中…如果有人不知道WAT是什么::)doGetFoo上的编译器错误是因为Bar是非泛型的,FooType是泛型参数吗?您应该重写,以使用泛型类型的单字母名称。很难读取根据此约定编写的代码。对,但它不应该选择它是什么?这不是泛型函数的点?啊!明白了!!!FooType的类型由我使用函数的上下文决定,而不是由我返回的内容决定!有道理…但是调用printFoo(getFoo())有什么问题?是否因为它没有确定要使用的泛型类型的正确方法,因此产生了一些随机的结果?如果您尝试
printFoo(this.getFoo())
我可能会工作,因为您已经锁定了getFoo
@Markus:FooType
中的类型。两个不同方法中的参数不一样。您已经看到,一个可以返回NotBar
另一个可以期望NotBar
。
Bound mismatch: The generic method printFoo(FooType) is not applicable
for the arguments (Foo<Foo<FooType>>). The inferred type Foo<Foo<FooType>>
is not a valid substitute for the bounded parameter <FooType extends Foo<FooType>>
obj.<NotBar>getFoo();
public <FooType extends Foo<FooType>> FooType doGetFoo()
public Foo<?> doGetFoo(){
return new Bar();
}
public <FooType extends Foo<FooType>> void doPrint() {
FooType foo = getFoo();
printFoo(foo);
}