Java泛型:如何扩展另一个泛型类的泛型类
首先,我有一个简单的模板,没有什么特别之处:Java泛型:如何扩展另一个泛型类的泛型类,java,generics,Java,Generics,首先,我有一个简单的模板,没有什么特别之处: public abstract class ListOfK<K> { private List<K> insides = new ArrayList<>(); } 公共抽象类ListOfK{ private List insides=new ArrayList(); } 接下来,我将使用模板创建一个服务接口 public abstract interface SomeService<K exte
public abstract class ListOfK<K> {
private List<K> insides = new ArrayList<>();
}
公共抽象类ListOfK{
private List insides=new ArrayList();
}
接下来,我将使用模板创建一个服务接口
public abstract interface SomeService<K extends ListOfK<K>> {
int calculateSomething (K input);
int calculateAnother (ListOfK<K> list);
}
公共抽象接口服务{
int计算方法(K输入);
int calculateAnother(ListOfK列表);
}
到目前为止,抽象性还不错
现在,让我们开始实施
public class ListOfString extends ListOfK<String> {
}
公共类ListOfString扩展了ListOfK{
}
以及服务的实现:
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{
@凌驾
公共整数计算方法(字符串输入){
返回0;//TODO impl
}
@凌驾
public int calculateAnother(ListOfK ListOfK){
返回0;//TODO impl
}
}
不知何故,当someserviceinpl
扩展SomeService
时,它标记类型参数java.lang.String不在其范围内;应扩展ListOfK
我应该输入什么作为SomeService
的实现,这样它就不会给出错误?还是我在服务上犯了错误?我只想要一个类,它的输入是另一个使用泛型的类
提前感谢。问题在于定义
SomeService
接口的方式。您的
代码表示“我们需要一个类K
,它扩展了ListOfK
,它使用K
作为其类型参数。”因此该类必须看起来像:
公共类测试扩展了ListOfK{
这没有任何意义。它不应该只在列表中使用它自己。如果您将界面更改为以下内容:
公共抽象接口SomeService这里的关键洞察是ListOfK
类中的K
与SomeService
类中的K
类型不同。事实上,在你对SomeService
的定义中,你是说K
本身需要是一个>ListOfK
,我怀疑这是您的问题
calculateMethoding
是否需要(1)取一个值,或(2)取一个ListOfK
值
calculateAnother
是否需要(1)取ListOfK
值,或(2)取ListOfK
值
我想你想要选项1,但实际上你已经选择了选项2
要解决此问题,请不要在SomeService
中约束K
:
public interface SomeService<K> {
int calculateSomething(K input);
int calculateAnother(ListOfK<K> list);
}
公共接口服务{
int计算方法(K输入);
int calculateAnother(ListOfK列表);
}
SomeService
你认为是什么意思?一个名为SomeService
的接口在使用classListOfK
时注册为泛型,如果我错了,请纠正我。我尝试了SomeService
但它没有给出。你使用class是什么意思?如何使用它?扩展了什么角色代码>关键字播放?@SotiriosDelimanolis它在其过程中使用了ListOfK
,例如稍后以方法int-calculatemething(K-input);int-calculateAnother(ListOfK-list);
的形式使用该代码“没有任何意义”但事实并非如此。递归参数化类型肯定有很好的用例。使用无界类型通配符不是一个好的解决方案(在大多数情况下,最好引入一个新的类型变量)。它就像一个符咒。谢谢@daniel pryden。你说得对,我想要选项1,但不知何故我得到了选项2。再次感谢:)