我正在实现一个类来存储可以分配双精度值的对象.因此,我创建了一个HasDoubleValue接口,其中包含一个方法:
public interface HasDoubleValue{
public double doubleValue();
}
我的主类定义如下:
Data <O extends HasDoubleValue> {...}
现在,当我尝试初始化此类以存储Integer时,尽管默认情况下Integer实现了doubleValue()方法,但我收到“类型参数Integer不在类型变量O的范围内”的错误.
我想发生这种情况是因为Integer尽管具有我正在寻找的方法,但并未明确实现我的HasDoubleValue接口.这是正确的吗?什么是自然的解决方法?
解决方法:
是的,没错. Java不使用鸭式输入作为JavaScript或TypeScript.
一种解决方案是创建一个包装Integer的适配器类,委托给它,并实际实现该接口.
或者,由于在这种情况下,您的接口是功能接口,因此可以使用lambda或方法引用从Integer创建HasDoubleValue的实例.
public interface HasDoubleValue{
double doubleValue();
}
final class IntegerHasDoubleValueAdapter implements HasDoubleValue {
private final Integer i;
public IntegerHasDoubleValueAdapter(Integer i) {
this.i = i;
}
@Override
public double doubleValue() {
return i.doubleValue();
}
}
class Data<O extends HasDoubleValue> {
void put(O o) {}
public static void main(String[] args) {
Integer i = 42;
Data<IntegerHasDoubleValueAdapter> d1 = new Data<>();
d1.put(new IntegerHasDoubleValueAdapter(i));
Data<HasDoubleValue> d2 = new Data<>();
d2.put(() -> i.doubleValue());
Data<HasDoubleValue> d3 = new Data<>();
d3.put(i::doubleValue);
}
}