繁体   English   中英

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

[英]Interface (two methods, different return types depending on class) Java

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

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;
  } 

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

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

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个不同的接口。

不,这是不可能的。 该接口充当可用签名的“绑定联系人”。

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

  1. 它必须是引用,而不是原语。
  2. 你在通话现场放松了类型安全。

您可以使用泛型执行此操作,但不会在运行时强制执行。 您还应该使用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作为返回类型。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM