在Java中使用自引用泛型类型

时间:2019-07-05 13:44:18

标签: java generics

考虑以下Java方法:

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

我可以将其输出分配给具有原始类型的变量,如下所示:

List x = getMyList();
List<List> y = getMyList();

但是,我想不出任何方法将其输出分配给完全参数化的类型。特别是,我想不出满足T

的非原始的具体类型List<T> z = getMyList();

我们可以创建一个T吗? 如果没有,为什么不呢?

对于上下文,我在尝试理解Java中如何实现枚举时创建了这个问题。

3 个答案:

答案 0 :(得分:0)

这是一个具体类型的示例,它既有效又开始暗示可能的用例(某种注册)。这种类型的行为既类似于某种类型的实例,又充当该类型的所有实例的容器。

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();
}

答案 1 :(得分:0)

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

class Example<T> implements List<Example<T>> {
...
}
...
List<Example<String>> list = getMyList();

答案 2 :(得分:0)

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

在编写SomeClass<T extends SomeClass<T>>时,您可以强制类型参数始终是实现类本身。

假设您具有此界面:

public interface MyInterface<T extends MyInterface<T>> {

    T getSelf();
}

这个实现类:

public class MyClass implements MyInterface<MyClass> {

    public MyClass getSelf() {
        return this;
    }
}

MyClass中,不能使用MyClass本身以外的任何其他类型参数。