java - 如何实现为对象实例添加值的默认接口(interface)方法

标签 java methods interface overriding default

如何实现 void add(Number number) 以便将 number 添加到对象实例

public interface Numbers {
   static int toIntValue();
   static void fromIntValue(int value);
   default void add(Number number) {
        // what do i write here
    }
}

最佳答案

你通常无法做到这一点;接口(interface)没有任何状态,“添加数字”的概念强烈暗示您希望更新状态。

这是一种方法:

public interface Number /* Isn't Numbers a really weird name? */ {
    int toIntValue();
    default int add(int otherValue) {
        return toIntValue() + otherValue;
    }
}

这里没有改变状态;相反,返回一个新的 int。

这里的另一个问题是,抽象数字类型的整个概念是,没有 add 的默认实现

这只是基础数学。复数是数字的一种; 在事先不了解任何关于复数的情况下编写将 2 个复数相加的代码显然是不可能的。

可以做的是从其他原语中创建add,除了“add”通常是方便的原语。例如,下面是一个可以作为默认方法的乘法,尽管它效率不高:

public interface Number {
    Number plus(Number a); /* an immutable structure makes more sense, in which case 'plus' is a better word than 'add' */
    default Number multiply(int amt) {
        if (amt == 0) return Number.ZERO; // Define this someplace.
        Number a = this;
        for (int i = 1; i < amt; i++) a = a.plus(this);
        return a;
    }
}

这里您已经用加号定义了乘法。

请注意,java 已经有了一个抽象数字概念 (java.lang.Number),而且它确实几乎无能为力,因为在任何语言中尝试像这样抽象数学都是困难的,尤其是这样在java中。

关于java - 如何实现为对象实例添加值的默认接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59237107/

相关文章:

c# - 如何将与特定 C# 接口(interface)匹配的所有类型放入 IDictionary 中?

抽象基类中的 c# 属性

java - 使用泛型返回列表的接口(interface)会导致警告

java - Camel servlet 没有带 http uri 的 spring 示例 <to> 标记?

java - Spring - 无法读取 HTTP 消息。缺少必需的请求正文

java - 把 JInternalFrame 放在前面

java - Java 9 模块的目录布局

ruby-on-rails - 为什么我收到错误 Undefined method `name' for nil :NilClass with Ruby on Rails?

java - 使用括号和逗号打印二维数组

algorithm - 查找日期是否在另一个日期之间的两个周末范围内