有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

考虑下面的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) 个答案

  1. # 1 楼答案

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

    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();
    }
    
  2. # 2 楼答案

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

  3. # 3 楼答案

    不确定我是否完全理解你的问题,但举个例子:

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