我有一个应用程序,我希望我的所有模型类都实现特定的 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/