假设我有这个功能:
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>
我不确定为什么允许这样做,但前面的例子不是。
答案 0 :(得分:0)
从Table<Record>
转换为Table<R>
是非法的,因为可以在编译时证明任何对象都不能同时为Table<Record>
和Table<R>
,因此保证不正确。编写一个可以在编译时证明不正确的强制转换是非法的。
(Table<R>)(Table<?>)tableOfRecord()
是一个由两个独立演员组成的序列,一个来自Table<Record>
到Table<?>
,还有一个来自Table<?>
到Table<R>
,每一个都是合法,因为在编译时,每个演员本身都不知道是不正确的。