繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM