我很惊讶,但是......这编译:
public <T extends Database> ColMetaData<T>[] getTableColumnsAsEnums() {
Class<? extends ColMetaData> cls = this.columnsEnumToken();
return cls.<ColMetaData<T>[]>getEnumConstants(); }
下面是 columnsEnumToken 的方法:
// Returns a class token for an enum class
public Class<? extends ColMetaData> columnsEnumToken() {
return this.e_colsToken;
}
(我想我可以明白为什么下面的第二行无法编译)
一些问题:
这种方法是“类型安全的”吗?
为什么这行编译:
Class<? extends ColMetaData> cls = this.columnsEnumToken();
但是由于类型不兼容,这个编译失败:
Class<? extends ColMetaData<T>> cls = this.columnsEnumToken();
为什么方法
getTableColumnsAsEnums()
返回一个具体参数化类型的数组是合法的,ColMetaData<T>[]
. 我曾认为这些是严格禁止的,因为没有运行时方法可以让它们安全地操作类型。