考虑以下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中如何实现枚举时创建了这个问题。
答案 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
本身以外的任何其他类型参数。