【问题标题】:Does a class which implements an interface's method (without explicitly implementing that interface) extend that specific interface?实现接口方法(没有显式实现接口)的类是否扩展了该特定接口?
【发布时间】:2019-04-07 23:08:45
【问题描述】:

我正在实现一个类来存储可以分配 double 值的对象。为此,我创建了一个 HasDoubleValue 接口,其中包含一个方法:

public interface HasDoubleValue{
    public double doubleValue();
}

我的主类是这样定义的:

Data <O extends HasDoubleValue> {...}

现在,当我尝试初始化此类以存储整数时,我收到“类型参数整数不在类型变量 O 的范围内”错误,尽管 Integer 实现了 doubleValue() 方法默认情况下。

我想这是因为 Integer 没有显式实现我的 HasDoubleValue 接口,尽管它具有我正在寻找的方法。这是正确的吗?自然的解决方法是什么?

【问题讨论】:

  • 在这种情况下,使用 DoubleSupplier 作为 lambda 将允许您在不更改所涉及的类的情况下调用它。

标签: java interface integer implementation implicit


【解决方案1】:

是的,没错。 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);
    }
}

【讨论】:

  • 谢谢!如果我不想专注于整数,而是希望允许任何类型的对象进入数据,只要它可以分配一个双精度值,这将如何改变?我正在考虑修改适配器类以检查是否有可用于该类型的 doubleValue() 方法,但这感觉会导致恶性循环...
  • 没有。您只需为无法直接实现 HasDoubleValue 的每种类型创建一个单独的适配器类,并将任何这些适配器的实例放入 Data
猜你喜欢
  • 2016-06-27
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2012-04-30
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多