繁体   English   中英

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

[英]returning calling class when using generic method in abstract class

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

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;
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM