繁体   English   中英

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

[英]Using self-referential generic types in Java

考虑以下Java方法:

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

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

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

但是,我想不出任何方法将其输出分配给完全参数化的类型。 特别是,我无法想到满足List<T> z = getMyList();的非原始的具体类型T List<T> z = 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();
}

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

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

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本身外,不能使用任何其他类型参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM