无法理解java通配符

Ale*_*yon 0 java wildcard covariance

我尝试从我的Main获取foo():

<T extends Main> T foo()
{
  return this; // "this" it is a instance of Main
}
Run Code Online (Sandbox Code Playgroud)

并使用它

Main m = new Main();
Main m2 = m.foo();
Run Code Online (Sandbox Code Playgroud)

我在方法foo()中遇到错误:" 不兼容的类型.必需的T,找到主要 ".
我知道我可以用这个:

<T extends Main> T foo2(T a) {
  return a;
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

Main m = new Main();
Main m3 = m.foo2(m);
Run Code Online (Sandbox Code Playgroud)

它工作正常.但我无法理解,为什么我不能使用第一种方法?因为this绝对是Main的实例扩展.

use*_*380 8

如果你<T extends Main> T foo();在Type中定义Main你不能只返回this,因为它T可能是一个子类型Main,Main当然不是.因此,如果你有MainSubType m = new Main().foo();编译器想要诱导T,MainSubType但面对它只是类型Main,所以你必须以艰难的方式解析它,我不能在这推荐,但这就是你去的方式<T extends Main> T foo(){return (T) this}.如果你这样做,你应该确实能够编译其余的.

如果它不能与foo()中的(T)-cast一起使用,则需要提供更多的上下文/代码.