【问题标题】:Java - Interfaces and methodsJava - 接口和方法
【发布时间】:2012-04-19 00:29:16
【问题描述】:

我现在正在浏览一些界面,我想知道为什么这不起作用:

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

基本上,为什么我不能实现接口中的方法?他们有不同的签名,因为一个有返回类型?名称、参数和返回类型难道不是使方法独一无二的吗?

【问题讨论】:

    标签: java interface methods


    【解决方案1】:

    您不能有不同的返回类型。想象一下

    class Foo implements I {
      public int doSomething(String x) {
        System.out.println(x);
        return(0);
      }
    }
    class Bar implements I {
      public void doSomething(String x) {
        System.out.println(x);
        return;
      }
    }
    
    List<I> l = new ArrayList();
    l.add(new Foo());
    l.add(new Bar());
    
    for (I i : l) {
      int x = i.doSomething();  // this makes no sense for Bar!
    }
    

    因此,返回类型也必须相同!

    【讨论】:

      【解决方案2】:

      是的,你基本上是正确的。 Java 不允许通过返回类型重载方法,这很整洁。但是,接口返回类型仍然必须匹配。

      【讨论】:

        【解决方案3】:

        方法签名由方法的名称和参数类型组成,因此您不能声明多个具有相同名称和相同数量和类型的参数的方法,因为编译器不能把它们区分开来。

        【讨论】:

          【解决方案4】:

          想想接口的典型用途:例如任何实现java List 接口的东西都必须实现boolean add(Object o)

          调用者可能会执行以下操作:

          if (!impl.add(o)) { /* report error */ }
          

          如果允许您更改返回类型,您会遇到所有类型的问题。

          void add(Object o)
          if (!impl.add(o)) { // ... your method returns void, so this makes no sense
          
          float add(Object o)
          if (!impl.add(o)) { // float to boolean ? are you sure that is what you meant?
          

          【讨论】:

            猜你喜欢
            • 2015-11-06
            • 1970-01-01
            • 2012-05-22
            • 2016-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-10
            相关资源
            最近更新 更多