Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于Java泛型的几个问题_Java_Generics_Type Mismatch - Fatal编程技术网

关于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);
}