首先,我有一个简单的模板,没什么花哨的:
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出错?我只想要一个使用通用的输入为另一个类的类。
谢谢。
答案 0 :(得分:0)
此处的主要见解是,在K
类的上下文中,ListOfK
与在K
类的上下文中,SomeService
的类型不同。实际上,在您对SomeService
的定义中,您是说K
本身必须是ListOfK
,我怀疑这是您的问题。
calculateSomething
是否需要采用(1)一个值,或(2)一个ListOfK
值?calculateAnother
是否需要获取(1)个ListOfK
值,或(2)一个ListOfK
个ListOfK
值?我认为您想要选项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<?>> {
它应该可以解决您的问题。