java-实现接口方法的类(没有显式实现该接口)是否扩展了该特定接口?

我正在实现一个类来存储可以分配双精度值的对象.因此,我创建了一个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);
    }
}
上一篇:mac电脑的使用


下一篇:Linux系统中虚拟设备文件的各种实用用法