目的是允许任何两种类型的匹配,"只要他们遵循界面。也就是说,如果类U与V匹配,则它实现以下接口
public interface Matchable<U, V>
并且可以与
匹配public class Matcher<U extends Matchable<U, V>, V extends Matchable<V, U>>
对于一个案例,我想匹配两个具有非常相似属性的类,因此我创建了一个基本的父类供他们继承:
public abstract class MatchingPairItem<T> implements Matchable<? extends MatchingPairItem<T>, T>
public class ClassA extends MatchingPairItem<ClassB>
public class ClassB extends MatchingPairItem<ClassA>
但我显然遗漏了泛型打字,收到多个错误,例如:
type argument ClassA is not within bounds of type-variable U
Matcher<ClassA, ClassB> matcher = new Matcher<ClassA, ClassB>();
^
where U,V are type-variables:
U extends Matchable<U,V> declared in class Matcher
V extends Matchable<V,U> declared in class Matcher
有人能指出我正确的方向吗?
答案 0 :(得分:2)
使用? extends MatchingPairItem<T>
,您正在尝试建模“类型参数是类的具体类型”。这不是Java泛型可以建模的东西。
我认为最好的办法是让MatchingPairItem
保留两个类型参数,一个代表“自我”类型:
abstract class MatchingPairItem<S, T> implements Matchable<S, T> {}
class ClassA extends MatchingPairItem<ClassA, ClassB> {}
class ClassB extends MatchingPairItem<ClassB, ClassA> {}
当然,这可能会打败你所寻求的一些便利,但这是一个不幸的现实。