(这是对this question的跟进,后者本身就是this question的后续行动。)
我有以下接口/类(下面的框架代码)
interface Copyable<C extends Copyable<C>> {
interface Validator<V extends Validator<V>> extends Copyable<V> {
interface ValidateValue<O> extends Validator<ValidateValue<O>> {
abstract class AbstractValidator<V extends AbstractValidator<V>> implements Validator<V> {
class VVNull<O> extends AbstractValidator<VVNull<O>> implements ValidateValue<O> {
在没有Copyable
的情况下执行<C extends Copyable<C>>
时过去常常工作,但是,正如之前的两个问题向我说明的那样,Copyable
确实需要这些泛型。
不幸的是,现在我无法编译VVNull
。
C:\java_code\CopyableCProblem.java:23: error: Validator cannot be inherited with different arguments: <ValidateValue<O>> and <VVNull<O>>
这是以下源代码中的第23行:
class VVNull<O> extends AbstractValidator<VVNull<O>> implements ValidateValue<O> {
VVNull<O>
一个ValidateValue<O>
。它将自身作为goodness-sakes的泛型参数传递,并实现ValidateValue<O>
。继承是完全线性的 - 没有“钻石”继承或任何东西,它是Copyable<--Validator<--ValidateValue<--VVNull
。
我意识到 - 或者实际上,我应该说我认为 - 自我泛型会起作用,也就是说,如果你使每个类都自我泛化,例如
VVNull<O,V extends VVNull<O,V>>
但我迫切希望找到另一种解决方案。当你开始需要自己的额外泛型的子类时,自引用泛型是完全混乱的。这就是为什么我只能通过Validator
进行自我泛化,因为它是最不可能直接使用的候选者。经常直接使用ValidateValue
和VVNull
。我真的很希望还有其他可能性。
可比较的工作正常而不需要在其所有实施类中使用自带泛型,那么我如何才能使这项工作适用于Copyable
?
感谢您的任何建议。
public class CopyableCProblem {
}
interface Copyable<C extends Copyable<C>> {
C getObjectCopy();
}
interface Validator<V extends Validator<V>> extends Copyable<V> {
}
interface ValidateValue<O> extends Validator<ValidateValue<O>> {
@Override
ValidateValue<O> getObjectCopy();
boolean isValid(O o_o);
}
abstract class AbstractValidator<V extends AbstractValidator<V>> implements Validator<V> {
}
class VVNull<O> extends AbstractValidator<VVNull<O>> implements ValidateValue<O> {
@Override
public VVNull<O> getObjectCopy() {
return this;
}
public boolean isValid(O o_o) {
return (o_o != null);
}
}