[英]Does a class which implements an interface's method (without explicitly implementing that interface) extend that specific interface?
我正在实现一个类来存储可以赋予double值的对象。 出于这个原因,我创建了一个HasDoubleValue接口,它包含一个方法:
public interface HasDoubleValue{
public double doubleValue();
}
我的主要课程定义如下:
Data <O extends HasDoubleValue> {...}
现在,当我尝试初始化此类以存储整数时,我得到一个“类型参数Integer不在类型变量O的范围内”错误,尽管Integer默认实现doubleValue()方法。
我想这是因为Integer没有显式实现我的HasDoubleValue接口,尽管它有我正在寻找的方法。 这是正确的吗? 一个自然的解决方法是什么?
是的,这是对的。 Java不使用duck-typing作为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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.