Java 限制子类声明

Java 限制子类声明,java,generics,inheritance,Java,Generics,Inheritance,我有一个应用程序,希望所有模型类都实现一个特定的update方法。为此,我创建了一个抽象类和一个接口,声明如下: public interface BaseInterface<T> { T update(T t); } public abstract class BaseClass<T extends BaseClass<T>> implements BaseInterface<T> { } 但是,使用上述构造,我无法限制模型类的声明

我有一个应用程序,希望所有模型类都实现一个特定的
update
方法。为此,我创建了一个
抽象类
和一个
接口
,声明如下:

public interface BaseInterface<T>
{
    T update(T t);
}

public abstract class BaseClass<T extends BaseClass<T>> implements BaseInterface<T>
{

}
但是,使用上述构造,我无法限制模型类的声明。例如,虽然
图书
类扩展
基类
是有效且必需的,但以下声明也有效:

class Book extends BaseClass<User>
{
    public User update(User u)
    {
        //implementation
    }
}
在这里,我们可以将
compareTo
方法的定义限制为使用其自身类型的
enum
而不是任何其他类型的
enum


提前感谢。

将您接口的定义更改为
接口基础接口

请以我为例:

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;
    }
}
公共接口BaseInterface{
T更新(T);
}
公共抽象类基类实现
基本接口{
}
公共类库扩展了基类{
@凌驾
公共书籍更新(b册){
返回null;
}
}
类用户{}
//由于您需要的原因,无法完全编译此代码。
公共类Book2扩展了基类{
@凌驾
公共Book2更新(Book2 b){
返回null;
}
}

我不认为,上面的代码完全符合我的要求。
Book2
的编码器可以轻松地将
update
方法重构为
User update(User u)
,然后代码就可以编译了。我想要的是,如果有一个类
C
,那么它的更新方法必须是
C update(C C)
像我一样尝试它。该代码无论如何都无法编译,因为类用户不满足要求:它不扩展基类。因此,编译错误出现在类标题中。@Swaranga Sarma:您可以强制子类定义特定的方法。但您无法阻止子类定义此方法的重载版本。@Alex…但如果用户扩展了基类,它就会编译。看在上帝的份上,请不要创建一个名为
BaseInterface
的接口,您不妨将其称为
Zywbxzytdkkenbfd
。它应该被称为
可更新的
。我将接口命名为BaseInterface,以明确我的问题。我不会在生产中使用它。
public class Enum<E extends Enum<E>> implements Comparable<E>
{
    int compareTo(E e)
    {
    }
}
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;
    }
}