在最近的一个问题中,我开始使用Number
抽象类。
现在,由于Java 8在这里,有默认方法,因此Number
可以一个接口并写成:
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
接口而不是抽象类有什么实际好处吗?
答案 0 :(得分:1)
这种变化肯定会立即破坏API,并导致破坏Java编程的世界。你不能将一个类(也就是Java那个时候存在的类)改成一个接口,因为它们都有不同的含义。两者都以不同的方式使用。
例如,只要你创建一个Number
接口,直接的子类,比如Integer
就会中断,因为一个类不能从接口extend
,但必须实现它。但是Integer
类来自Number
。
您可能会争辩说,在更改Number
时,Java API设计器也可以相应地更改Java API中必需的子类。但是他们不能忽视这样一个事实,即其他人的类可能会从Number
扩展出来。
关于这个问题产生的事实还有一件事 - 使用默认方法的interface
与abstract
类不同。这是discussed quite a few times on SO itself,其中一个仅由您回答。