java - 限制子类声明

标签 java generics inheritance

我有一个应用程序,我希望我的所有模型类都实现特定的 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本身[即C extends BaseClass<C> ],仅此而已。

我该如何实现?

注意:这有点类似于 enum声明

public class Enum<E extends Enum<E>> implements Comparable<E>
{
    int compareTo(E e)
    {
    }
}

在这里我们可以限制 compareTo 的定义方法获取其自身类型的实例 enum而不是任何其他类型的 enum .

提前致谢。

最佳答案

将您的界面定义更改为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;
    }
}

关于java - 限制子类声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908300/

相关文章:

javascript继承是危险的

java - 使用时出现令人惊讶的 NullPointerException ? :

java - 创建另一个 res 子文件夹来放置布局文件

java - 从java中的json数组获取特定值

c++ - 通用回调

Ruby 从基类访问派生类 "class methods"

c++ - C++ 中的继承和接口(interface)

java 求反运算符

java - 如何为 f :selectItems? 中的枚举创建和使用通用 bean

java - 对通用数据结构数组进行排序