接口方法Java中的泛型类型

时间:2015-11-10 23:58:05

标签: java generics methods interface

我的界面中有这个方法:

  public String getValue();

字符串仅用于此处的示例,我不想返回字符串。

我希望将该方法放在将返回int,chars或bools(取决于类)的类中。例如,我有一个实现我的界面的Animal类,并且有这个方法。我希望它在动物中调用此方法时返回一个int。我有另一个具有此方法的类人员,并且当在Person上调用此方法时,我希望它返回一个char。

public class Animal implements myInterface {
  @Override
  public int getValue() {
    return 5;
  }
}

public class Person implements myInterface {
  @Override
  public char getValue() {
    return 'c';
  }
}

我知道我必须用泛型来做这件事。但我究竟该怎么做呢?

如果我将接口中的String替换为泛型类型,例如:

public <T> T getValue();

然后它说我不能从int(或char)转换为T。

我该怎么办?感谢。

2 个答案:

答案 0 :(得分:5)

这样做的正确方法是使用通用接口:

public interface MyInterface<T> {
  public T getValue();
}

public class Animal implements MyInterface<Integer> {
  @Override
  public Integer getValue() {
    return 5;
  }
}

然而,这真的像一个X / Y问题;更不用说它非常低效,装箱和拆箱所有这些原语。

你想要达到什么目的?你的目标是什么?

答案 1 :(得分:1)

实际上

    public <T> T getValue();

可以被

覆盖
    public Character getValue()

这很奇怪......对于一些backward-comparability mumbo jumbo来说。不要这样做。

通常,我们说返回类型可以是协变的,即我们可以在重写方法中返回一个子类型。由于charint的{​​{3}},我们可能会认为这应该有效

    public int getValue();

    // overridden by
    public char getValue()

然而,java subtype如果返回类型是原始的,那么它必须是相同的,没有协方差。