15

一部のコードを Java 5 にアップグレードしていますが、明らかに Generics について理解していません。Comparable を一度実装する他のクラスがあり、実装できました。しかし、今では、継承のために、2 つの型に対して Comparable を実装しようとするクラスを取得しました。これが私の状況です:

私は次のクラス/インターフェースを持っています:

interface Foo extends Comparable<Foo>

interface Bar extends Comparable<Bar>

abstract class BarDescription implements Bar

class FooBar extends BarDescription implements Foo

これにより、「interface Comparable を異なる引数で複数回実装することはできません...」というエラーが表示されます。

FooBar に compareTo(Foo foo) を実装し、BarDescription にも compareTo(Bar) を実装できないのはなぜですか? これは単にメソッドのオーバーロードではありませんか?

編集: BarDescription を拡張する多くのクラスがあります。BarDescription を拡張するすべてのクラスをソートするときに、Comparable on Bar の型パラメーターを削除して raw 状態のままにすると、コンパイラーの警告が大量に表示されます。これは、以下のワイルドカードの回答で解決されますか? その答えは非常に複雑で、メンテナンスのために理解するのが難しいようです。

4

3 に答える 3

15

バイトコードがコンパイルされた後、ジェネリックは存在しません。

これからの制限: 2 つ以上のインターフェイス / クラスを実装 / 拡張することはできません。それらは、ジェネリック パラメーターなしでは同じであり、ジェネリック パラメーターでは異なります。

タイプセーフが本当に必要な場合にできることは次のとおりです。

interface Foo<T extends Foo<?>> extends Comparable<T>
interface Bar<T extends Bar<?>> extends Comparable<T>
abstract class BarDescription<T extends Bar<?>> implements Bar<T>
class FooBar extends BarDescription<FooBar> implements Foo<FooBar>
于 2010-04-21T18:31:35.207 に答える
8

私はいくつかのComparatorsを書いて、それで終わります。

于 2010-04-21T18:54:09.360 に答える
1

ワイルドカードを考慮すると、ジェネリック インターフェイスの複数の実装があると問題が発生します。

これは消去によらない。

于 2010-04-21T19:20:17.450 に答える