Re: Mixing self conscious parametrized types with inheritance
Robert Klemme wrote:
inspired by our recent discussions of generics I set out to get a clear
picture of how to properly use Comparable<T> - especially when inheritance
comes into play.
1. Only classes whose methods that use the type parameter may not be
overridden with type specific functionality (either because all methods or the
class is final, or the type need not change when sub classes override those)
can do away with the type parameter.
Would you please describe this a bit more fully, perhaps with an example? I'm
not quite getting it.
2. All others need to repeat the type parameter (in case of self reference
with a bound).
class BaseC<SC extends BaseC<?>> implements Comparable<SC> {
The convention is to use single-letter type parameters.
I totally don't get what you're asserting here.
Why do you want 'Base' to implement 'Comparable' on a subtype instead of on
itself?
Why the wildcard rather than 'class BaseC <S extends Base <S>>'?
The usual approach is 'class Foo implements Comparable <Foo>', not of some
subtype of 'Foo'.
I'd like to say:
class Base <S extends Base <S>> implements Comparable <Base <S>>
Mind you, I don't think generics work with multiply-nested type parameters
beyond a certain point, or maybe I just can't mentally encompass the type
assertions they make.
Just like I haven't mentally encompassed the type assertions you're trying to
make. The difficulties don't seem to involve 'Comparable' so much as what
you're actually attempting to aver.
@Override
public int compareTo(SC o) {
return getKey() - o.getKey();
}
}
class SubC<SC extends SubC<?>> extends BaseC<SC> {
@Override
public int compareTo(SC o) {
final int cmp = getK() % 3 - o.getK() % 3;
return cmp == 0 ? getK() - o.getK() : cmp;
}
}
final class FinalC extends SubC<FinalC> {
@Override
public int compareTo(FinalC o) {
final int cmp = getX() % 2 - o.getX() % 2;
return cmp == 0 ? getPos() - o.getPos() : cmp;
}
}
Full code is here https://gist.github.com/868085
--
Lew
Honi soit qui mal y pense.