class 实现接口方法(没有明确实现该接口)是否扩展了该特定接口?
Does a class which implements an interface's method (without explicitly implementing that interface) extend that specific interface?
我正在实施 class 来存储可以分配 double 值的对象。为此,我创建了一个 HasDoubleValue 接口,其中包含一个方法:
public interface HasDoubleValue{
public double doubleValue();
}
我的主要class是这样定义的:
Data <O extends HasDoubleValue> {...}
现在,当我尝试初始化这个 class 来存储整数时,我得到一个 "type argument Integer is not within bounds of type-variable O" 错误,尽管整数实现了 doubleValue() 方法默认情况下。
我想这是因为 Integer 没有明确实现我的 HasDoubleValue 接口,尽管它有我正在寻找的方法。这是正确的吗?自然的解决方法是什么?
是的,没错。 Java 不使用 duck-typing 作为 JavaScript 或 TypeScript。
一个解决方案是创建一个适配器 class 包装一个整数,委托给它,并实际实现接口。
或者,由于在这种情况下您的接口是功能接口,因此使用 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);
}
}
我正在实施 class 来存储可以分配 double 值的对象。为此,我创建了一个 HasDoubleValue 接口,其中包含一个方法:
public interface HasDoubleValue{
public double doubleValue();
}
我的主要class是这样定义的:
Data <O extends HasDoubleValue> {...}
现在,当我尝试初始化这个 class 来存储整数时,我得到一个 "type argument Integer is not within bounds of type-variable O" 错误,尽管整数实现了 doubleValue() 方法默认情况下。
我想这是因为 Integer 没有明确实现我的 HasDoubleValue 接口,尽管它有我正在寻找的方法。这是正确的吗?自然的解决方法是什么?
是的,没错。 Java 不使用 duck-typing 作为 JavaScript 或 TypeScript。
一个解决方案是创建一个适配器 class 包装一个整数,委托给它,并实际实现接口。
或者,由于在这种情况下您的接口是功能接口,因此使用 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);
}
}