只是扩展问题..
假设一个类实现了一个接口并扩展了一个抽象类,并且两者都具有相同的方法(名称+签名),但返回类型不同。现在,当我重写该方法时,它仅在我使返回类型与接口声明的返回类型相同时编译。
另外,如果方法在抽象类或接口中声明为私有或最终会发生什么?
**附注。在一次采访中,爱因斯坦先生在这个问题上坚持了很长时间。是否有一个流行的场景是我们这样做还是他只是在炫耀?
只是扩展问题..
假设一个类实现了一个接口并扩展了一个抽象类,并且两者都具有相同的方法(名称+签名),但返回类型不同。现在,当我重写该方法时,它仅在我使返回类型与接口声明的返回类型相同时编译。
另外,如果方法在抽象类或接口中声明为私有或最终会发生什么?
**附注。在一次采访中,爱因斯坦先生在这个问题上坚持了很长时间。是否有一个流行的场景是我们这样做还是他只是在炫耀?
不,相同的方法名称和参数,但不同的返回类型在 Java 中是不可能的。底层 Java 类型系统无法*确定运行时对方法的调用之间的差异。
(*我相信有人会证明我错了,但无论如何,该解决方案很可能被认为是糟糕的风格。)
关于私有/最终:由于您必须实现这些方法,因此接口方法和抽象方法都不能是最终的。接口方法默认是公共的。抽象方法不能是私有的,因为它必须在实现类中可见,否则您永远无法实现方法实现,因为您的实现类无法“看到”该方法。
如果抽象类中的方法也是抽象的,则必须在它扩展的第一个具体类中提供其实现。此外,您将必须提供接口的实现。如果这两种方法仅在返回类型上有所不同,则具体类将具有仅在返回类型上有所不同的重载方法。而且我们不能有仅在返回类型上有所不同的重载方法,因此会出现错误。
interface io {
public void show();
}
abstract class Demo {
abstract int show();
}
class Test extends Demo implements io {
void show () { //Overloaded method based on return type, Error
}
int show() { //Error
return 1;
}
public static void main (String args[]) {
}
}
使用接口,方法默认是抽象和公共的,因此它们不能有任何其他访问说明符并且它们不能是最终的
对于抽象类,抽象方法可以具有除私有之外的任何访问说明符,并且因为它们是抽象的,所以它们不能是最终的
重写时,方法签名必须相同;和协变(声明的返回类型的子类)返回类型是允许的
一个类不能实现两个具有相同名称但返回类型不同的方法的接口。它会给出编译时错误。默认情况下,接口内部的方法是公共抽象的,它们没有任何其他说明符。
interface A
{
public void a();
}
interface B
{
public int a();
}
class C implements A,B
{
public void a() // error
{
//implementation
}
public int a() // error
{
//implementation
}
public static void main(String args[])
{
}
}