为什么java不允许通用超类型转换,但允许通过通配符转换?

时间:2016-07-02 11:18:24

标签: java generics

假设我有这个功能:

kMDItemVersion

类型Table<Record> tableOfRecord() {} 。我还有其他功能:

TableRecord<R extends TableRecord> extends Record

以上编译失败:

<R extends TableRecord<R>> Table<R> table(Table<R> table, String filtered) {
    // ...
    return (Table<R>) tableOfRecord();
}

然而,这编译并运行良好:

error: incompatible types: Table<Record> cannot be converted to Table<R>

我不确定为什么允许这样做,但前面的例子不是。

1 个答案:

答案 0 :(得分:0)

Table<Record>转换为Table<R>是非法的,因为可以在编译时证明任何对象都不能同时为Table<Record>Table<R>,因此保证不正确。编写一个可以在编译时证明不正确的强制转换是非法的。

(Table<R>)(Table<?>)tableOfRecord()是一个由两个独立演员组成的序列,一个来自Table<Record>Table<?>,还有一个来自Table<?>Table<R>,每一个都是合法,因为在编译时,每个演员本身都不知道是不正确的。