gpt4 book ai didi

java - 在泛型父类(super class)中实现 Comparable

转载 作者:行者123 更新时间:2023-12-01 06:45:30 26 4
gpt4 key购买 nike

我有一个抽象通用父类(super class),我将其扩展为具有特定类型 ID 的具体类:

public abstract class AbstractEntity<I> {
...
private I id;
private String name;
...
}

我创建这样的具体类:

public class User extends AbstractEntity<Long> {...}

现在我想让具体类与它们自身的其他实例进行比较(而不是其他类型——这应该在编译时强制执行)。默认情况下,compareTo 方法应仅按名称排序,因此我想将其添加到父类(super class)中以避免重复代码。我想出的唯一方法是使用这个丑陋的结构:

public abstract class AbstractEntity<I,T> implements Comparable<AbstractEntity<I,T>> {
...
private I id;
private String name;
...
@Override
public int compareTo(AbstractEntity<I,T> o) {
...
}
}

...

public class User extends AbstractEntity<Long,User> {...}

我认为这很丑陋,因为现在为了扩展父类(super class),您需要再次重复具体的类名作为其自身的类型参数,这是奇怪且违反直觉的。有没有更优雅的方法来完成我所缺少的同样的事情?

谢谢!

最佳答案

你正在寻找的是“ self 类型”,但这在Java中无法实现。最接近的方法是使用递归绑定(bind)类型参数,该参数应该是 self 类型:

public abstract class AbstractEntity<I, E extends AbstractEntity<I, E>> implements Comparable<E> {
...
private I id;
private String name;
...
public final String getName() {
return name;
}
...
@Override
public int compareTo(E otherEntity) {
final String otherName = otherEntity.getName();
...
}
}

public final class User extends AbstractEntity<Long, User> { }

不过,我建议不要使用这种模式,因为它很令人困惑并且很容易被滥用。例如:

public final class EvilUser extends AbstractEntity<Long, AnotherUser> { }

我的建议:坚持在单个实体的基础上实现Comparable

关于java - 在泛型父类(super class)中实现 Comparable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16228132/

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