这是一个懒惰的问题,但你得到了代表:-)
我有一个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)
按照这个问题?
你有没有尝试过直截了当
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,您可以声明重写方法以具有共变量返回类型,这意味着这就是:子类可以具有更具体的返回类型的重写方法签名.
为什么不让它们全部返回界面?您必须在接口中定义所有可能的链接方法,并在基类中提供"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#进行编程.希望你明白了.