"多级"泛型,具有子类和接口

时间:2014-10-04 09:26:13

标签: java generics

目的是允许任何两种类型的匹配,"只要他们遵循界面。也就是说,如果类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

有人能指出我正确的方向吗?

1 个答案:

答案 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> {}

当然,这可能会打败你所寻求的一些便利,但这是一个不幸的现实。