私のJavaプロジェクトに取り組んでいる間、私はむしろ奇妙なことに遭遇しました。
私は、この基本メソッドを持っていますinterface
:
public interface Registry<T extends FlakeType<? extends F>, F extends Flake> {
@Nullable
public <E extends F> T findType(@Nonnull String name);
}
明らかに、typeパラメータは、E
それはどちらも戻り値の型や引数に使用されていないので、完全に役に立たないです。私のIDEはまた、そのことについて私に通知します。
そして、私は拡張別のインターフェイスを持っていますRegistry
:
public interface EntityRegistry extends Registry<EntityType<? extends Entity>, Entity> {
@Nullable
@Override
<E extends Entity> EntityType<E> findType(@Nonnull String name);
}
コンテキストの場合、Entity
拡張しFlake
、EntityType<E extends Entity>
拡張しFlakeType<E>
。
私はからこのメソッドの戻り値の型を指定するattemting午前見ることができるようにEntityType<? extends Entity>
(このタイプはから来ているT
に型パラメータを)EntityType<E>
しながら、E
メソッドの型パラメータです<E extends Entity>
。
論理的に、? extends Entity
かつE extends Entity
ので、この場合には同じことを意味しE
、他の制限やそのそして、このためには拡張タイプのためのワイルドカードとしても本質的機能のようなものを持っていませんEntity
。
これは完全に正常に動作します。
しかし、IVEはその私のIDE(のIntelliJ)による通知を気づきました
Typeパラメータは、
E
使用されることはありません。
これは、私はそれが明らかに無用であると戻り値または任意の引数のいずれかに何らかの関係を持っていないので、私はそれを削除することができることを考えさせられました。
オーバーライドメソッドは、独自提供しE
ない方法で基本メソッドに同じ名前の役に立たないタイプのパラメータとは何かを持っている必要がありtypeパラメータを。それとも持って?
私はこれに私のベースの方法を変更したら、理由は次のとおりです。
@Nullable
public T findType(@Nonnull String name);
それを上書きするのと同じ方法ではもはや不可能でした:
findType(String)
中EntityRegistry
との衝突findType(String)
でRegistry
、両方の方法は、まだどちらも他を上書きしない、同じ消去を持っています。
私の質問は次のようになります。
オーバーライドメソッドは戻り値ジェネリック型を指定したいときはなぜJavaは、基本法では役に立たないタイプのパラメータを必要としていますか?オーバーライドするメソッドが提供するパラメータが十分ではありませんか。
なぜ、後者の場合にはない仕事を上書きしますか?それは署名ではなく、別のタイプのパラメータが使用されている明示的なワイルドカードのことを除いて、最初のケースとまったく同じであるが、それは同じことを意味しているので、違いは何であるため、動作しないべきか?
私は、ジェネリック医薬品に関するいくつかの間違った仮定をしたと確信していると私はこれで混乱しています理由です。あなたは私のためにそれをクリアしてもらえますか?
前もって感謝します!
型パラメータは、メソッドシグネチャの一部です。あなたにはこれを見つけることができJLS 8.4.2:
二つの方法またはコンストラクタ、MおよびN、彼らは同じ名前を持っている場合は、同じシグネチャを持つ、同じ型パラメータ(もしあれば)(§8.4.4)、および、型パラメータにNの仮パラメータ型を適応した後Mの、同じ仮パラメータ型。
メソッドM1のシグネチャはメソッドのシグネチャのサブシグニチャである
m2
かのいずれか。
m2
同じシグネチャを有しm1
、または署名が
m1
消失(同じである§4.6の署名)m2
。二メソッドのシグネチャ
m1
とm2
しているオーバーライド相当いずれかIFFm1
のサブシグニチャであるm2
か、m2
のサブシグニチャですm1
。
内型パラメータなしRegistry
でこの方法は、EntityRegistry
それがオーバーライドとして見られないように、ベース・インターフェース・メソッドのサブシグニチャを有していません。