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