我只是在玩界面,我有一个问题,是关于一些我无法真正理解的事情。
下面的代码没有运行,是我所期望的行为,因为接口方法需要该方法为任何对象工作,并且实现的方法将签名更改为只允许字符串对象。
interface I {
    public void doSomething(Object x);
}
class MyType implements I {
    public void doSomething(String x) {
        System.out.println(x);
    }
}然而,使用下面的代码块,我惊讶地看到它确实工作了。我认为它不能工作,因为我们期望返回一个对象,而实现的方法只返回一个string对象。为什么这样做,这里传递的参数和返回类型的两个原则之间有什么区别呢?
interface I {
    public Object doSomething(String x);
}
class MyType implements I {
    public String doSomething(String x) {
        System.out.println(x);
        return(x); 
    }
}发布于 2012-05-14 15:57:09
public Object doSomething(String x);得把东西还回去。任何东西,事实上,只要它是某种类型的物体。所以如果你实现
public String doSomething(String x) {stuff}这很好,因为它实际上返回了一个对象。它将返回的对象将始终是一个字符串这一事实并不是什么大不了的。
第一个示例不起作用的原因是,只接受字符串比接受任何对象更有限制。但是只返回字符串是可以的。
比方说,如果你有一份合同来粉刷一栋大楼,你就会雇佣一些员工来帮你解决问题。合同要求你雇佣任何适用的油漆工,不管他们有多高,但没有指定要使用什么颜色的油漆。如果你只雇用超过6英尺高的画家(这是输入,只接受字符串而不是所有物体),你就违反了合同。但是,选择只使用蓝色油漆(只返回字符串)是很好的,因为合同没有指定颜色,只是必须对建筑物进行油漆。
发布于 2012-05-14 15:53:04
它的工作是因为String是一个Object。
发布于 2012-05-14 15:55:11
来自java语言规范:
如果返回类型是引用类型,则
返回类型在重写彼此的方法中可能有所不同。返回类型可替换性的概念支持协变量返回,即返回类型对子类型的专门化。
换句话说,它的工作方式与您所做的一样,但是如果接口中的返回类型是String,而实现类中的对象是Object,则它将无法工作。
https://stackoverflow.com/questions/10586702
复制相似问题