我有一个应用程序,我希望我的所有模型类都实现特定的update
方法。为此,我使用以下声明创建了abstract class
和interface
:
public interface BaseInterface<T>
{
T update(T t);
}
public abstract class BaseClass<T extends BaseClass<T>> implements BaseInterface<T>
{
}
因此我的所有模型类都将扩展BaseClass
。例如,Book
类定义将是
public class Book extends BaseClass<Book>
{
public Book update(Book b)
{
//implementation
}
}
但是使用上面的构造我无法限制我的模型类的声明。例如,虽然Book
类有效并且需要扩展BaseClass<Book>
,但以下声明也有效:
class Book extends BaseClass<User>
{
public User update(User u)
{
//implementation
}
}
虽然在语法上正确执行上述操作但我想限制它。
基本上我希望我的模型类'update
方法将参数作为其自己类的一个实例,并返回其自己的类的实例,而不是别的。
换句话说,如果某个类C
扩展为BaseClass
,则其update
方法必须具有确切的签名C update(C c)
。
或者换句话说,如果某个类C
扩展为BaseClass
,则BaseClass
的模板参数必须为C
本身[ie {{ 1}}]并没有别的。
我如何实现这一目标?
注意:这有点类似于C extends BaseClass<C>
声明
enum
在这里,我们可以限制public class Enum<E extends Enum<E>> implements Comparable<E>
{
int compareTo(E e)
{
}
}
方法的定义,以获取其自己的compareTo
类型的实例,而不是任何其他类型的enum
。
提前致谢。
答案 0 :(得分:2)
将您的界面定义更改为interface BaseInterface<T extends BaseClass<T>>
。
请按照我的例子:
public interface BaseInterface<T extends BaseClass<T>> {
T update(T t);
}
public abstract class BaseClass<T extends BaseClass<T>> implements
BaseInterface<T> {
}
public class Book extends BaseClass<Book> {
@Override
public Book update(Book b) {
return null;
}
}
class User {}
// This code cannot be compiled exactly for reason you want.
public class Book2 extends BaseClass<User> {
@Override
public Book2 update(Book2 b) {
return null;
}
}