ms3*_*449 6 java generics casting type-conversion type-erasure
为什么(T)这个通用接口需要不安全的转换?如果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;
}
}
Run Code Online (Sandbox Code Playgroud)
因为不能保证this实际上是类的实例,T甚至不能扩展它.
例如,考虑一下:
public class T0 implements ExtendComparable<T0> {...}
public class T1 implements ExtendComparable<T0> {...}
Run Code Online (Sandbox Code Playgroud)
在T0符合条件时符合罚款:T0 extends ExtendComparable<T0>并且T0是T0的超级.在这种情况下this是T0这里的一个实例所以你很好; 演员(T)this(因此(T0)this)是有道理的.
随着T1因为结合被施加到声明也正确T0无T1,T被取代的T0.然而this,T1并且T1不是超级也不是孩子的T0.是的,都是实施
ExtendedCompatible<T0>,但你不能在兄弟姐妹之间施放.例如,Integer和Double扩展Number但(Integer) new Double(0.0)失败.演员也被(T)翻译成(T0)失败.
您所做的假设T是将设置为与已声明的类相同,并且当前无法强制使用这些语义.我希望这将在Java语言的未来版本中的某些时候发生变化,但也许实际上存在Java语言"任务组"无法避免这样做的原因.
有一种方法可以完全避免强制转换,但是当你创建ExtendedCompatible一个抽象类而不是一个接口时,它会更好.
您可以声明一个类型的最终字段,T该值将由受保护的构造函数通过扩展类来设置,而该类又必须this作为其值传递:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
您支付的价格是对自身的愚蠢引用以及传递this给父构造函数所增加的代码/ CPU负担的额外内存消耗.
另一种方法是声明一个抽象方法来获取T(this):
// Parent abstract class:
protected abstract T getThiz();
// Child class... for each class:
protected MyChildClass getThiz() { return this; }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |