如何编写一个Java函数,它返回一个类型为'this'的实例,并在扩展时起作用?

Mat*_*ell 2 java generics

这是一个懒惰的问题,但你得到了代表:-)

我有一个Java类,它返回自身的实例以允许链接(例如ClassObject.doStuff().doStuff())

例如:

public class Chainer
{
    public Chainer doStuff()
    {
       /* Do stuff ... */
       return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想扩展这个课程.有没有办法,也许使用泛型,扩展这个类而不必覆盖每个方法签名?

不是:

public class ChainerExtender extends Chainer
{
    public ChainerExtender doStuff()
    {
       super.doStuff();
       return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过了:

public class Chainer
{
    public <A extends Chainer> A doStuff()
    {
       /* Do stuff ... */
       return (A)this;
    }
}

public class ChainerExtender extends Chainer
{
    public <A extends Chainer> A doStuff()
    {
       /* Do stuff ... */
       return super.doStuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用给出错误:

type parameters of <A>A cannot be determined; 
no unique maximal instance exists for type variable A with upper bounds A,Chainer
Run Code Online (Sandbox Code Playgroud)

我是否被迫拥有类声明:

public class Chainer<T extends Chainer<T>> {}
public class ChainerExtender extends Chainer<ChainerExtender>
Run Code Online (Sandbox Code Playgroud)

按照这个问题

Dov*_*man 9

你有没有尝试过直截了当

public class Chainer
{
    public Chainer doStuff()
    {
       /* Do stuff ... */
       return this;
    }
}

public class ChainerExtender extends Chainer
{
    @Override
    public ChainerExtender doStuff()
    {
       /* Do stuff ... */
       super.doStuff();
       return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Java 5,您可以声明重写方法以具有共变量返回类型,这意味着这就是:子类可以具有更具体的返回类型的重写方法签名.


tva*_*son 6

为什么不让它们全部返回界面?您必须在接口中定义所有可能的链接方法,并在基类中提供"null"实现,但您可以链接到您的内心.

public interface IChainer
{
  IChainer doStuff();
  IChainer doSomethingElse();
}

public class Chainer implements IChainer
{
  public IChainer doStuff()
  {
     // really do something
     return this;
  }

  public IChainer doSomethingElse()
  {
      return this; // do nothing
  }
}

public class ChainerExtender extends Chainer
{
   // simply inherits implementation for doStuff()

   public override IChainer doSomethingElse()
   {
       // really do something
       return this;
   }
}
Run Code Online (Sandbox Code Playgroud)

注意:我上面可能有一些语法问题.在过去的几年里,我一直在使用C#进行编程.希望你明白了.