Java泛型:如何扩展另一个泛型类的泛型类

时间:2019-05-09 12:42:55

标签: java generics

首先,我有一个简单的模板,没什么花哨的:

public abstract class ListOfK<K> {
   private List<K> insides = new ArrayList<>(); 
}

接下来,我正在使用模板创建服务接口

public abstract interface SomeService<K extends ListOfK<K>> {
    int calculateSomething (K input);
    int calculateAnother (ListOfK<K> list);
}

到目前为止,抽象性还不错。

现在,让我们开始实施

public class ListOfString extends ListOfK<String> {

}

和SomeService的实现:

public class SomeServiceImpl extends SomeService<String> {
  @Override
  public int calculateSomething(String input) {
    return 0;  // TODO impl
  }

  @Override
  public int calculateAnother(ListOfK listOfK) {
    return 0;  // TODO impl
  }
}

以某种方式,当SomeServiceImpl扩展SomeService<String>时,它标记为Type parameter java.lang.String is not within its bound; should extend ListOfK<String>

我应该输入什么作为SomeService的实现,这样它才不会出错?还是使用SomeService出错?我只想要一个使用通用的输入为另一个类的类。

谢谢。

2 个答案:

答案 0 :(得分:0)

此处的主要见解是,在K类的上下文中,ListOfK与在K类的上下文中,SomeService的类型不同。实际上,在您对SomeService的定义中,您是说K本身必须是ListOfK,我怀疑这是您的问题。

  • calculateSomething是否需要采用(1)一个值,或(2)一个ListOfK值?
  • calculateAnother是否需要获取(1)个ListOfK值,或(2)一个ListOfKListOfK值?

我认为您想要选项1,但是您实际上已经选择了选项2。

要解决此问题,请不要在K中约束SomeService

public interface SomeService<K> {
    int calculateSomething(K input);
    int calculateAnother(ListOfK<K> list);
}

答案 1 :(得分:-1)

问题出在定义SomeService接口的方式上。您的代码<K extends ListOfK<K>>说:“我们需要扩展K的类ListOfK,该类使用K作为其类型参数。”因此该类必须看起来像:

public class Test extends ListOfK<Test> {

这没有任何意义。它不仅应该在列表中使用自己。如果您将界面更改为以下内容:

public abstract interface SomeService<K extends ListOfK<?>> {

它应该可以解决您的问题。