Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型:如何扩展另一个泛型类的泛型类_Java_Generics - Fatal编程技术网

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
的接口在使用class
ListOfK
时注册为泛型,如果我错了,请纠正我。我尝试了
SomeService
但它没有给出。你使用class是什么意思?如何使用它?
扩展了什么角色关键字播放?@SotiriosDelimanolis它在其过程中使用了
ListOfK
,例如稍后以方法
int-calculatemething(K-input);int-calculateAnother(ListOfK-list);
的形式使用该代码“没有任何意义”但事实并非如此。递归参数化类型肯定有很好的用例。使用无界类型通配符不是一个好的解决方案(在大多数情况下,最好引入一个新的类型变量)。它就像一个符咒。谢谢@daniel pryden。你说得对,我想要选项1,但不知何故我得到了选项2。再次感谢:)