java如何将非泛型接口扩展为泛型接口?
我试图扩展^{
public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>> {
T adjustInto(T temporal);
}
当我试图直接扩展基本接口时
public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>>
extends TemporalAdjuster {
T adjustInto(T temporal);
}
我犯了个错误
...java: name clash: ... have the same erasure, yet neither overrides the other
有没有办法做到这一点
到目前为止,我做到了
public interface TypedTemporalAdjuster<T extends Temporal & Comparable<? super T>> { //extends TemporalAdjuster {
static <T extends Temporal & Comparable<? super T>> TypedTemporalAdjuster<T> of(
final Class<T> temporalClass, final TemporalAdjuster temporalAdjuster) {
return temporal -> temporalClass.cast(temporalAdjuster.adjustInto(temporalClass.cast(temporal)));
}
T adjustInto(T temporal);
}
# 1 楼答案
您不能用更严格的参数重写方法,即
T adjustInto(T temporal);
不重写Temporal adjustInto(Temporal temporal);
,因为参数类型T
比Temporal
更严格。现在有两个名为adjustInto
的方法,但是由于类型擦除,参数类型在字节码级别是相同的,因为T extends Temporal & Comparable<? super T>
被擦除为Temporal
您可以通过将声明更改为
此时,语义相同的
T extends Comparable<? super T> & Temporal
被擦除为Comparable
,而不是Temporal
。您还可以使用T extends Object & Comparable<? super T> & Temporal
,它会被删除为Object
(通常,只有当您需要与前泛型代码兼容时,这些知识才相关)但是,基本问题仍然存在,
adjustInto(T temporal);
不会覆盖adjustInto(Temporal temporal);
,因为T
是一个限制性更强的参数,所以现在,接口不再是函数接口,因为它有两个抽象方法TemporalAdjuster
的子接口必须提供其所有操作,包括接受任何Temporal
的adjustInto
。所以你只能这样做然而,这样的包装调整器不能确保正确的参数,只能隐藏类型转换,这在运行时仍然可能失败。但是看起来您正在试图解决一个不存在的问题,因为您可以简单地在时态上使用
with
方法来获得类型安全操作,例如这甚至比你的包装更强大,比如当你这样做的时候
根据
LocalDate
操作,您只定义一次操作,而它通过动态转换而不是强制转换来为其他临时对象工作