gpt4 book ai didi

java - 限制子类声明

转载 作者:行者123 更新时间:2023-11-30 09:46:57 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com