我大致有以下这些类型:
interface Record {}
interface UpdatableRecord extends Record {}
interface Insert<R extends Record> {
// Calling this method only makes sense if <R extends UpdatableRecord>
void onDuplicateKeyUpdate();
}
在调用onDuplicateKeyUpdate()
时,我希望对<R>
有一个额外的限制。这是因为当<R>
绑定到任何UpdatableRecord
子类型时,此方法才有意义,而不仅仅是Record
。例如:
Insert<?> i1;
Insert<Record> i2;
Insert<UpdatableRecord> i3;
// these shouldn't compile
i1.onDuplicateKeyUpdate();
i2.onDuplicateKeyUpdate();
// this should compile
i3.onDuplicateKeyUpdate();
有没有什么技巧或方法可以在一个方法声明中为类的泛型类型添加额外的限制?
注意:
- 声明`Insert`不是一个选项,因为我想要一个`Insert`用于那些不可更新的记录。 - 可能会派生`UpdatableInsert extends Insert`并将方法下推,但我不想引入新类型。我有几个这样的方法,带有几个不同的限制,这会导致类型数量爆炸。 - 抛出`UnsupportedOperationException`显然是一种解决方式,但它似乎是使用Java 1.4的方法。我真的很想知道是否可以使用泛型和编译器来解决这个问题。
理想解决方案:
// This would be an annotation to be interpreted by the compiler. There is no such
// thing in Java, as far as I know. But maybe there's a trick having the same effect?
@Require(R extends UpdatableRecord)
void onDuplicateKeyUpdate();
Insert
接口中的onDupliceteKeyUpdate()
方法移除,然后创建一个新接口UpdatableInsert<R extends UpdatableRecord> extends Insert<R>
,在该接口中重新定义void onDuplicateKeyUpdate();
方法。这样做是否可行? - Howard