【发布时间】:2021-03-28 10:04:42
【问题描述】:
这是一个学术问题,旨在更好地理解泛型在这种情况下的行为。
Enum 类型被描述为“所有 Java 语言枚举类型的公共基类”。它的定义是:
public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable {
}
现在,我可以用这个定义定义一个字段:
public class MyClass {
public Enum<MyEnum> field;
}
一切都好。现在,更进一步。因为Enum<MyEnum> 显然等同于MyEnum,所以我相信根据定义我也可以这样写:
public class MyClass {
public Enum<Enum<MyEnum>> field;
}
但是现在编译器实际上阻止了我:Type parameter 'java.lang.Enum' is not within its bound; should extend 'java.lang.Enum<MyEnum>>,它根据定义执行它,因为它仍然满足:E extends Enum<E>。当然,你不允许这种重复(或者可能更好,招致)构造的原因有很多,但给定的一个对我来说确实是错误的。
另一方面,如果我要定义这样的类(类似于Enum 的定义)
public class Wrapper<T extends Number> {
}
我可以写一个类:
public class MyClass {
// satisfies the upper bound
public Wrapper<Integer> field1;
// also satisfies the upper bound
public Wrapper<Number> field2;
}
是我忽略了什么还是我的分析被误导了?
【问题讨论】:
-
对不起,如果我误解了这个问题,
public MyEnum field可以为你工作吗? -
"我可以用这个定义定义一个字段:
public Enum<MyEnum> field" --- 你为什么要这样?为什么不把它定义为public MyEnum field,因为MyEnum extends Enum<MyEnum>,并且将是唯一类这样做。 -
这与实际解决方案无关。这是为了更好地理解语言。