首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java -接口方法

Java -接口方法
EN

Stack Overflow用户
提问于 2012-05-14 15:48:34
回答 8查看 223关注 0票数 3

我只是在玩界面,我有一个问题,是关于一些我无法真正理解的事情。

下面的代码没有运行,是我所期望的行为,因为接口方法需要该方法为任何对象工作,并且实现的方法将签名更改为只允许字符串对象。

代码语言:javascript
运行
复制
interface I {
    public void doSomething(Object x);
}

class MyType implements I {
    public void doSomething(String x) {
        System.out.println(x);
    }
}

然而,使用下面的代码块,我惊讶地看到它确实工作了。我认为它不能工作,因为我们期望返回一个对象,而实现的方法只返回一个string对象。为什么这样做,这里传递的参数和返回类型的两个原则之间有什么区别呢?

代码语言:javascript
运行
复制
interface I {
    public Object doSomething(String x);
}

class MyType implements I {
    public String doSomething(String x) {
        System.out.println(x);
        return(x); 
    }
}
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-05-14 15:57:09

代码语言:javascript
运行
复制
public Object doSomething(String x);

得把东西还回去。任何东西,事实上,只要它是某种类型的物体。所以如果你实现

代码语言:javascript
运行
复制
public String doSomething(String x) {stuff}

这很好,因为它实际上返回了一个对象。它将返回的对象将始终是一个字符串这一事实并不是什么大不了的。

第一个示例不起作用的原因是,只接受字符串比接受任何对象更有限制。但是只返回字符串是可以的。

比方说,如果你有一份合同来粉刷一栋大楼,你就会雇佣一些员工来帮你解决问题。合同要求你雇佣任何适用的油漆工,不管他们有多高,但没有指定要使用什么颜色的油漆。如果你只雇用超过6英尺高的画家(这是输入,只接受字符串而不是所有物体),你就违反了合同。但是,选择只使用蓝色油漆(只返回字符串)是很好的,因为合同没有指定颜色,只是必须对建筑物进行油漆。

票数 3
EN

Stack Overflow用户

发布于 2012-05-14 15:53:04

它的工作是因为String是一个Object

票数 2
EN

Stack Overflow用户

发布于 2012-05-14 15:55:11

来自java语言规范:

如果返回类型是引用类型,则

返回类型在重写彼此的方法中可能有所不同。返回类型可替换性的概念支持协变量返回,即返回类型对子类型的专门化。

换句话说,它的工作方式与您所做的一样,但是如果接口中的返回类型是String,而实现类中的对象是Object,则它将无法工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10586702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档