在抽象类中使用通用方法时返回调用类

问题描述 投票:0回答:1

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

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

   //...

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

不与非抽象类一起使用

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”?我很确定这是一个明显的错误,但我看不到。

java generics abstract
1个回答
0
投票

使用此代码:

//                                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是类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;
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.