接口(两种方法,不同的返回类型,取决于类)Java

时间:2016-05-08 23:03:37

标签: java interface

任何扩展接口的类都必须实现接口中声明的方法。不确定这是否可行,但我想做的是以下内容:

interface test {
   ____ get();
}

class A extends test {
  int val;

  A(int x) {
    val = x;
  }

  int get() {
    return Val;
  } 


  class B extends test {
  String val;

  B(String x) {
    val = x;
  }

  String get() {
    return Val;
  } 

是否可以使用能够返回两种不同数据类型的方法签名?

4 个答案:

答案 0 :(得分:14)

不完全相同,但您可以使用泛型类型参数。

interface Test<T> {
    T get();
}

class A implements Test<Integer> {
    int val;

    A(int x) {
        val = x;
    }

    @Override
    public Integer get() {
        return val;
    }
}

class B implements Test<String> {
    String val;

    B(String x) {
        val = x;
    }

    @Override
    public String get() {
        return val;
    }
}

正如您所看到的,您必须使用Integer,因为仿制品不能使用原语。

另请注意,同一界面的2个版本现在基本上是2个不同的界面。

答案 1 :(得分:0)

不,这是不可能的。该界面用作&#34;绑定联系人&#34;可用的签名。

如果你想要,你可以让函数返回Object,并允许不同的实现返回不同类型的值,但是:

  1. 必须是引用,而不是原语。
  2. 您在通话现场疏忽了类型安全。

答案 2 :(得分:0)

您可以使用泛型执行此操作,但不会在运行时强制执行。您还应该使用implements在类中实现接口,而不是extends

interface Test<T> {
   T get();
}

class A implements Test<Integer> {
    int val;

    A(int x) {
        val = x;
    }

    @Override
    Integer get() {
       return Val;
    } 

}

class B implements Test<String> {
    String val;

    B(String x) {
       val = x;
    }

    @Override
    String get() {
        return Val;
    }
}

泛型仅适用于类,因此您不得不使用Integer而不是int作为返回类型。

答案 3 :(得分:0)

这个编译,虽然我不确定我建议这样做:

interface test {
   Object get();
}

class A implements test {
  int val;

  public A(int x) {
    val = x;
  }

  public Integer get() {
    return val;
  } 
}

class B implements test {
  String val;

  public B(String x) {
    val = x;
  }

  public String get() {
    return val;
  } 
}

在Java中使用返回类型覆盖方法是合法的,该返回类型是原始方法的返回类型的子类。这被称为“协方差”。它仅适用于返回类型,而不适用于参数。请注意,要进行编译,我必须在课程getA返回Integer而不是int。另外:在实现接口时使用implements,而不是extends;并确保在引用变量时使用正确的字母大小写(发布的代码中的Val不起作用)。

正如我所说的,我不确定我是否推荐这个,因为在任何声明test类型的代码中,get()的结果是Object,你会必须投射其他东西才能使它变得有用。如果可能,应该使用泛型。但是,并非总是可行。在编写这样的界面之前,我会仔细考虑你的设计。可能是界面并不是你想要的。但是,如果没有更多关于你要完成什么的细节,我无法分辨。