Comparableを実装していないクラスを、TreeSetなどで扱う際、コンパイルエラーではなく、実行時エラー(ClassCastException)がスローされる仕様になっている。
これは、ジェネリクス使用時に、親クラスはComparableインターフェースを実装せずに、子クラスがComparableを実装するシーンを想定していると考えられる。
例
Musician親クラスはComaparableを実装していないが、子クラスが実装している。
class Musician {
public enum Category {
ROCK, JAZZ, CLASSIC
}
public String getName() {
return name;
}
public Category getCategory() {
return category;
}
private String name;
private Category category;
Musician(String name, Category category) {
this.name = name;
this.category = category;
}
}
class ChildMusician extends Musician implements Comparable {
ChildMusician() {
super("", null);
}
@Override
public int compareTo(Object o) {
return 0;
}
}
実行
Set<Musician> musicianSet = new TreeSet<>();
musicianSet.add(new ChildMusician());
子クラスの存在がなければ、一行目でコンパイルエラーを出した方が効率的だと考えられるが、子クラスが存在することもあるため、実行時にキャストのチェックをするようになっている。