限制子类声明

时间:2011-08-02 06:54:43

标签: java generics inheritance

我有一个应用程序,我希望我的所有模型类都实现特定的update方法。为此,我使用以下声明创建了abstract classinterface

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

提前致谢。

1 个答案:

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