Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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,考虑以下Java方法: <T extends List<T>> List<T> getMyList() { return Collections.emptyList(); } List getMyList(){ 返回集合。emptyList(); } 我可以将其输出分配给原始类型的变量,如下所示: List x = getMyList(); List<List> y = getMyList(); List x=getMyList();

考虑以下Java方法:

<T extends List<T>> List<T> getMyList() {
    return Collections.emptyList();
}
List getMyList(){
返回集合。emptyList();
}
我可以将其输出分配给原始类型的变量,如下所示:

List x = getMyList();
List<List> y = getMyList();
List x=getMyList();
列表y=getMyList();
但是,我想不出任何方法将其输出分配给完全参数化的类型。特别是,我想不出一个非原始的、具体的类型
t
能够满足
listz=getMyList()

我们可以创建这样一个
T
? 若否,原因为何


在上下文中,我在试图理解如何在Java中实现枚举时提出了这个问题。

下面是一个具体类型的示例,它既起作用,又开始提示可能的用例(某种类型的注册)。类型组合的行为既像某个类型的实例,又像该类型的所有实例的容器

public class WeirdEnum extends AbstractList<WeirdEnum> {

  private static List<WeirdEnum> underlyingList = new ArrayList<>();

  @Override
  public WeirdEnum get(int index) { return underlyingList.get(index); }

  @Override
  public int size() { return underlyingList.size(); }

  static <T extends List<T>> List<T> getAList() {
    return Collections.emptyList();
  }

  public WeirdEnum() {
    underlyingList.add(this); // Sufficient for our example but not a good idea due to concurrency concerns.
  }

  static List<WeirdEnum> foo = WeirdEnum.getAList();
}
公共类WeirdEnum扩展了AbstractList{
private static List underyinglist=new ArrayList();
@凌驾
public-WeirdEnum-get(int-index){return underyinglist.get(index);}
@凌驾
public int size(){return underyinglist.size();}
静态列表getAList(){
返回集合。emptyList();
}
公众怪人(){
underyinglist.add(this);//对于我们的示例来说已经足够了,但由于并发性问题,这不是一个好主意。
}
静态列表foo=WeirdEnum.getAList();
}

我不确定是否完全理解您的问题,但这里有一个例子:

类示例实现列表{
...
}
...
List=getMyList();

Java中的每个枚举都从基本枚举类
enum
扩展而来,其中
T
是实现枚举的实际类型

在编写
SomeClass
时,可以强制执行类型参数始终是实现类本身

假设您有这个接口:

公共接口MyInterface{
T getSelf();
}
这个实现类:

公共类MyClass实现MyInterface{
公共MyClass getSelf(){
归还这个;
}
}

MyClass
中,除了
MyClass
本身之外,不可能使用任何其他类型参数。

如果这个问题更清楚地表达了观点,请随意为这个问题建议一个替代标题。