关于java:如果要将Number实现为接口,是否会产生问题?

Would it create issues if Number were to be implemented as an interface? Are there benefits?

在最近的一个问题上,我偶然发现了Number抽象类的用法。

既然Java 8在这里,就有默认方法,所以EDCOX1×0可能是一个接口,并写成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public interface Number {
    public int intValue();

    public long longValue();

    public float floatValue();

    public double doubleValue();

    default public byte byteValue() {
        return (byte)intValue();
    }

    default public short shortValue() {
        return (short)intValue();
    }
}

如果是这样的话,使用Number抽象类的旧代码还会编译吗?使Number成为接口而不是抽象类有什么实际好处吗?


这样的改变肯定会立即破坏API,并导致Java编程的混乱。你不能改变一个类(也就是说,自从Java出现时存在的那个类)变成一个接口,因为这两个类都有不同的含义。两者的使用方式不同。

例如,一旦您使Number成为一个接口,那么立即的子类(例如,Integer就会中断,因为类不能从接口extend出来,但必须实现它。但Integer类从Number扩展而来。

您可能会认为,在改变EDCOX1(0)时,Java API设计器也可以相应地改变Java API中必要的子类。但他们不能忽视这样一个事实,即其他人可能拥有从Number扩展而来的类。

关于这个问题产生的事实,还有一件事——使用默认方法的interfaceabstract类不同。这个问题本身已经讨论了好几次了,其中一个问题只有你自己回答。