gpt4 book ai didi

java - 如何避免在 Java 泛型扩展 Comparable 接口(interface)中进行未经检查的强制转换?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:06 25 4
gpt4 key购买 nike

为什么 unsafe cast (T)这个通用接口(interface)需要吗?如果T与自身相当,即实现 ExtendedComparable<super of T>这也意味着 ExtendedComparable<T> ,那么为什么类型删除需要 ExtendedComparable<T>被投到T?

/* @param <T> T must be comparable to itself or any of its superclass
* (comparables are consumers, thus acc. to the PECS principle
* = producer-extends,consumer-super we use the bounded wildcard type "super")
*/
public interface ExtendedComparable<T extends ExtendedComparable<? super T>> {
Comparator<? super T> getComparator();
default boolean greaterThen(T toCompare) {
return getComparator().compare((T) this, toCompare) > 0;
}
}

最佳答案

因为不能保证this实际上是类 T 的一个实例甚至扩展它。

例如考虑这个:

public class T0 implements ExtendComparable<T0> {...}
public class T1 implements ExtendComparable<T0> {...}

T0很好,因为它符合界限:T0 extends ExtendComparable<T0> T0 是 T0 的超。在这种情况下 thisT0 的实例在这里,所以你很好; Actor (T)this (因此 (T0)this )是有道理的。

T1声明也是正确的,因为绑定(bind)应用于 T0没有T1 , T被取代 T0 .然而thisT1T1不是 super 也不是 T0 的 child .是的,两者都实现 ExtendedCompatible<T0> ,但你不能在 sibling 之间转换。例如 Integer 和 Double 扩展 Number 但 (Integer) new Double(0.0)失败。 Actor 也是如此 (T)翻译成(T0)失败。

您所做的假设是 T将被设置为与声明的类相同,目前没有办法强制这些语义。我希望这会在未来的 Java 语言版本中有所改变,但也许 Java 语言“特别工作组”避免这样做是有实际原因的。

有一种方法可以完全避免强制转换,但当您使用 ExtendedCompatible 时会更好。抽象类而不是接口(interface)。

您可以声明类型为 T 的最终字段哪个值将由 protected 构造函数通过扩展类来设置,而类又必须通过 this作为其值(value):

public abstract class ExtendedCompatible<T extends ExtendedCompatible<? super T>> {
private final T thiz;

protected ExtendedCompatible(final T thiz) {
if (this != thiz) throw new IllegalArgumentException("you must pass yourself");
this.thiz = thiz;
}
...

public class MyExtendedCompatible extends ExtendedCompatible<MyExtendedCompatible> {
public MyExtendedCompatible() {
super(this);
}
}

您付出的代价是对自身的愚蠢引用所消耗的额外内存,以及通过 this 所增加的代码/CPU 负担。到父构造函数。

另一种方法是声明一个抽象方法来获取 T (这个):

// Parent abstract class:
protected abstract T getThiz();
// Child class... for each class:
protected MyChildClass getThiz() { return this; }

关于java - 如何避免在 Java 泛型扩展 Comparable 接口(interface)中进行未经检查的强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46274638/

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