Java 泛型:为有效替代绑定 mismatch.Looking
Java generics: Bound mismatch.Looking for the valid substitute
我有几个通用的 类:
public interface Data<E> {}
public interface Clonable<E extends Clonable<E>> {}
public interface NaturalNumberInterface extends Data<NaturalNumberInterface> {}
public class NaturalNumber implements NaturalNumberInterface {}
public interface SetInterface<E extends Data<E>> extends Clonable<SetInterface<E>> {}
public class Set<E extends Data<E>> implements SetInterface<E> {}
当我尝试创建 Set Set<NaturalNumber> s=new Set<NaturalNumber>();
的新实例时,编译器说:
NaturalNumber
is not valid substitute for the type parameter <E extends Data<E>>
of the type Set<E>
也许你能帮我找出错误,因为我花了很长时间没有找到解决办法。
我假设您的 SetInterface
的定义方式与 ListInterface
相同,而 Data
只是 interface Data<T>
。
SetInterface
的通用参数是 F-bounded: E extends Data<E>
。在您当前的代码 NaturalNumber
中键入 extends Data<NaturalNumberInterface>
。因此,如果 E
是 NaturalNumber
,则违反条件,因为它应该扩展更具体的类型 Data<NaturalNumber>
。
您也应该为 NaturalNumberInterface
使用 F 边界:
public interface NaturalNumberInterface<T extends NaturalNumberInterface<T>> extends Data<T>
public class NaturalNumber implements NaturalNumberInterface<NaturalNumber>
这样就可以了。
我有几个通用的 类:
public interface Data<E> {}
public interface Clonable<E extends Clonable<E>> {}
public interface NaturalNumberInterface extends Data<NaturalNumberInterface> {}
public class NaturalNumber implements NaturalNumberInterface {}
public interface SetInterface<E extends Data<E>> extends Clonable<SetInterface<E>> {}
public class Set<E extends Data<E>> implements SetInterface<E> {}
当我尝试创建 Set Set<NaturalNumber> s=new Set<NaturalNumber>();
的新实例时,编译器说:
NaturalNumber
is not valid substitute for the type parameter<E extends Data<E>>
of the typeSet<E>
也许你能帮我找出错误,因为我花了很长时间没有找到解决办法。
我假设您的 SetInterface
的定义方式与 ListInterface
相同,而 Data
只是 interface Data<T>
。
SetInterface
的通用参数是 F-bounded: E extends Data<E>
。在您当前的代码 NaturalNumber
中键入 extends Data<NaturalNumberInterface>
。因此,如果 E
是 NaturalNumber
,则违反条件,因为它应该扩展更具体的类型 Data<NaturalNumber>
。
您也应该为 NaturalNumberInterface
使用 F 边界:
public interface NaturalNumberInterface<T extends NaturalNumberInterface<T>> extends Data<T>
public class NaturalNumber implements NaturalNumberInterface<NaturalNumber>
这样就可以了。