Если вы посмотрите на исходный код Enum
, он имеет следующее:
public abstract class Enum>
implements Comparable, Serializable {
public final int compareTo(E o) {
Enum> other = (Enum>)o;
Enum self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
@SuppressWarnings("unchecked")
public final Class getDeclaringClass() {
Class> clazz = getClass();
Class> zuper = clazz.getSuperclass();
return (zuper == Enum.class) ? (Class)clazz : (Class)zuper;
}
public static > T valueOf(Class enumType,
String name) {
T result = enumType.enumConstantDirectory().get(name);
if (result != null)
return result;
if (name == null)
throw new NullPointerException("Name is null");
throw new IllegalArgumentException(
"No enum constant " + enumType.getCanonicalName() + "." + name);
}
}
Прежде всего, что означает E extends Enum
? Это означает, что параметр типа является чем-то, что простирается от Enum и не параметризуется с необработанным типом (он сам параметризуется).
Это актуально, если у вас есть перечисление
public enum MyEnum {
THING1,
THING2;
}
, который, если я правильно знаю, переведен на
public final class MyEnum extends Enum {
public static final MyEnum THING1 = new MyEnum();
public static final MyEnum THING2 = new MyEnum();
}
Таким образом, это означает, что MyEnum получает следующие методы:
public final int compareTo(MyEnum o) {
Enum> other = (Enum>)o;
Enum self = this;
if (self.getClass() != other.getClass() && // optimization
self.getDeclaringClass() != other.getDeclaringClass())
throw new ClassCastException();
return self.ordinal - other.ordinal;
}
И что еще более важно,
@SuppressWarnings("unchecked")
public final Class getDeclaringClass() {
Class> clazz = getClass();
Class> zuper = clazz.getSuperclass();
return (zuper == Enum.class) ? (Class)clazz : (Class)zuper;
}
Это делает getDeclaringClass()
отличным от соответствующего объекта Class
.
Ярким примером является тот, на который я ответил на этот вопрос , где вы не можете избежать этой конструкции, если хотите указать общую привязку.