"Layered" generics with subclass and interfaces

The goal is to allow any two types of classes to "match" as long as they follow an interface. That is, if class U is compatible with V, it implements the following interface

public interface Matchable<U, V>

      

and can be matched with

public class Matcher<U extends Matchable<U, V>, V extends Matchable<V, U>>

      

In one case, I wanted to map two classes with very similar properties, so I created a base parent class to inherit them:

public abstract class MatchingPairItem<T> implements Matchable<? extends MatchingPairItem<T>, T>
public class ClassA extends MatchingPairItem<ClassB>
public class ClassB extends MatchingPairItem<ClassA>

      

But I am clearly missing something with typical typing, getting a few errors like:

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

      

Can anyone point me in the right direction?

+3


source to share


1 answer


With the help ? extends MatchingPairItem<T>

you are trying to model "the type parameter is the specific type of the class". It's just not something that Java generics can model.

I think your best bet is to store MatchingPairItem

with two type parameters representing the type "self":



abstract class MatchingPairItem<S, T> implements Matchable<S, T> {}
class ClassA extends MatchingPairItem<ClassA, ClassB> {}
class ClassB extends MatchingPairItem<ClassB, ClassA> {}

      

Sure, this might beat some of the amenities you were looking for, but it's an unfortunate reality.

+2


source







All Articles