2016-12-26 5 views
0

私は汎用インターフェイスA<T>を持っていますが、私はA<String>を実装するクラスBを持っています。私はBを拡張してA<Number>を実装するクラスCを作成しました。異なるタイプの引数を持つインターフェイスを実装できません

A cannot be inherited with different type arguments <String> and <Number>.

この許可されていない理由:Cについては は、私が言ってコンパイルエラーを取得しますか? これに対する回答がタイプ消去の場合は、詳細を説明してください。

サンプルコード:

public interface A<T> { 

} 

public class B implements A<String> { 

} 

public class C extends B implements A<Number> { 
} 
+2

作業するコードのスケルトンを提供した場合は、これに少し答える方が簡単です。メジャーはありませんが、あなたが直面しているのと同じエラーを再現するのに十分です。 – Makoto

+0

@Raj質問でお願いします – GurV

+0

どうすればいいですか?それについて考える。 Cは既にからBを実装しています。 – GurV

答えて

2

あなたができればそれは正直、意味がありません。

は、ここでのシナリオです:

  • BAを実装し、A<String>からA<T>をバインドします。
  • CBから継承(すでにA<String>にバインドである)、そしてあなたもA<Number>を実装しようとしています。

両方の方法で実装された型を持つことはできません。

あなたはCに何とかNumberを組み込みたい場合は、あなただけのACないでタイプを持っている必要があります。これは、コンパイルされますが、それは奇妙に見えるだろう

public class C<T> extends B implements A<String> { 

} 

は、最終的にこれは本当にあなたの階層をレイアウトする必要があるかに帰着します。 本当にの場合にはBCの関係が必要な場合は、このように具体的な型は意味をなさない。その代わりにgenericとしてTを使用してください。最後に、継承のおかげで、AからBまでの一般契約にはまだCという名前でアクセスできるので、実装する必要はありません。 §8.1.5状態で

public interface A<T> { 


} 

public class B<T> implements A<T> { 

} 

public class C<T> extends B<T> { 

} 
1

Java言語仕様次

クラスが同時に同じ汎用の異なるパラメータ化されている2種類のインタフェースタイプ のサブタイプでないかもしれませんインターフェイス (§9.1.2)、またはジェネリックインターフェイス のパラメータ化のサブタイプと同じ汎用インターフェイスをネーミングするrawタイプ、またはコンパイル時には エラーが発生します。

この要件は、型消去(§4.6)で 翻訳をサポートするために導入されました。

これは、消去後、クラスには同じシグネチャを持つメソッド(あれば)がある可能性があることを意味します。詳細についてはAngelika Langerのsiteを参照してください。

関連する問題