[解決済み] メソッドは、タイプ内の別のメソッドと同じ消去を持つ
質問
同じクラスに次の2つのメソッドを持つことは、なぜ不正なのでしょうか?
class Test{
void add(Set<Integer> ii){}
void add(Set<String> ss){}
}
を取得します。
compilation error
メソッド add(Set) は、Test 型の別のメソッドと同じ消去を持つ。
というのも、javacはなぜこのようなことをしないのでしょうか?
多くの場合、これら2つのメソッドのロジックは非常に類似しており、1つのメソッドで置き換えることができるとわかります。
public void add(Set<?> set){}
メソッドを使用することができますが、必ずしもそうとは限りません。
を2つ持ちたい場合、これは余計に厄介なことです。
constructors
というのも、これらの引数を取る一方の
constructors
.
解決方法は?
このルールは、生の型をまだ使用しているレガシーコードでの衝突を避けるためのものです。
なぜこれが許されなかったのか、その理由を説明します。 JLSから引用しました。 仮に、Javaにジェネリックが導入される前に、次のようなコードを書いたとしよう。
class CollectionConverter {
List toList(Collection c) {...}
}
このように、私のクラスを拡張するのです。
class Overrider extends CollectionConverter{
List toList(Collection c) {...}
}
ジェネリックの導入後、私は自分のライブラリを更新することにしました。
class CollectionConverter {
<T> List<T> toList(Collection<T> c) {...}
}
アップデートの準備が出来ていないので
Overrider
クラスだけです。を正しくオーバーライドするために
toList()
メソッドに対して、生の型は "オーバーライド等価であると言語設計者は決定しました。つまり、あなたのメソッドのシグネチャは私のスーパークラスのシグネチャと形式的には等しくなくなりましたが、あなたのメソッドはまだオーバーライドされます。
さて、時間が経ち、あなたはクラスを更新する準備ができたと判断しました。しかし、あなたは少し失敗して、既存の生の
toList()
メソッドを
追加
のように新しいメソッドを追加します。
class Overrider extends CollectionConverter {
@Override
List toList(Collection c) {...}
@Override
<T> List<T> toList(Collection<T> c) {...}
}
raw型のオーバーライドの等価性から、どちらの方法も有効な形で
toList(Collection<T>)
メソッドを使用します。しかし、当然ながら、コンパイラは単一のメソッドを解決する必要があります。この曖昧さをなくすために、クラスはオーバーライド等価なメソッド、つまり消去後に同じパラメータ型を持つメソッドを複数持つことができないようになっています。
重要なのは、これは生の型を使う古いコードとの互換性を維持するために作られた言語ルールであるということです。コンパイル時にメソッドの解決が行われるため、メソッド識別子にジェネリック型を追加すれば十分だったのですが、型パラメータの消去が必要とした制限ではありません。
関連
-
Java Exceptionが発生しました エラー解決
-
Eclipseで "XXXX "の解決策を(型に)解決することができない
-
HttpClientがGZIP形式でない場合の対処法
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
[解決済み] 静的メソッドを使用する場合
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] なぜJava 8のOptionalは引数で使ってはいけないのか
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み] voidメソッドが例外を投げるかどうかをMockitoがテストする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
java.util.NoSuchElementException 原因解析と解決方法
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
Spring Boot による HTTPS アクセスの設定
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
テストが見つかりませんでした