在抽象 class 中使用泛型方法时返回调用 class

returning calling class when using generic method in abstract class

我有一个奇怪的问题,我无法理解。我猜是因为我对泛型不熟悉。

public abstract class AbstractClass <T extends AbstractClass <T>> {

   //...

   public <T extends AbstractClass> T genericMethod(){
   //do stuff
   return (T) this;
   }
}

不得将此与非抽象一起使用 Class

public class MyClass extends AbstractClass <MyClass> {
   //...
   public void anotherMethod() {
    //do other stuff
  }

}

到目前为止或多或少还可以(可能不理想,但还可以)。现在是令人困惑的部分:

private MyClass stubWithMyClassAsReturnValue(){
   //more stuff
   return new MyClass();
}

public void test1(){
   MyCalss  myClass = stubWithMyClassAsReturnValue().genericMethod();
   myClass.anotherMethod();
   //---> works just fine
}

public void test2(){
   stubWithMyClassAsReturnValue().genericMethod().anotherMethod();
   //---> compiling error because AbstractClass does not know about anotherMethod(),
   // so genericMethod() returns AbstractClass and not MyClass
}

我想可能存在某种隐式转换。我怎样才能使代码更流畅并摆脱这个多余的"myClass"?我很确定有一个明显的错误,但我没有看到它。

在此代码中:

//                                this T
//                                   v
public abstract class AbstractClass <T extends AbstractClass <T>> {
//     and this T
//         v
   public <T extends AbstractClass> T genericMethod(){
   //do stuff
   return (T) this;
   }
}

突出显示的两个 T 是不同的 T。第一个 T 是 class AbstractClass 的泛型参数。第二个 TgenericMethod 的泛型参数。这两个 T 没有关联,并且是独立推断的。

当你这样做时:

stubWithMyClassAsReturnValue().genericMethod()

编译器知道第一个 T 是什么 - MyClass,但不知道第二个 T 应该是什么,所以它只使用上限 - AbstractClass。但是 anotherMethodAbstractClass 中不可用,因此出现错误。

你可能只需要一个 T:

public abstract class AbstractClass <T extends AbstractClass <T>> {

   public T genericMethod(){
       //do stuff
       return (T) this;
   }
}