基本法は、未使用の型パラメータが含まれている場合、なぜ、この一般的な方法だけで仕事をオーバーライドしますか?

enveeed:

私の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拡張しFlakeEntityType<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は、基本法では役に立たないタイプのパラメータを必要としていますか?オーバーライドするメソッドが提供するパラメータが十分ではありませんか。

  • なぜ、後者の場合にはない仕事を上書きしますか?それは署名ではなく、別のタイプのパラメータが使用されている明示的なワイルドカードのことを除いて、最初のケースとまったく同じであるが、それは同じことを意味しているので、違いは何であるため、動作しないべきか?

私は、ジェネリック医薬品に関するいくつかの間違った仮定をしたと確信していると私はこれで混乱しています理由です。あなたは私のためにそれをクリアしてもらえますか?

前もって感謝します!

ジョーンVernee:

型パラメータは、メソッドシグネチャの一部です。あなたにはこれを見つけることができJLS 8.4.2

二つの方法またはコンストラクタ、MおよびN、彼らは同じ名前を持っている場合は、同じシグネチャを持つ、同じ型パラメータ(もしあれば)§8.4.4)、および、型パラメータにNの仮パラメータ型を適応した後Mの、同じ仮パラメータ型。

メソッドM1のシグネチャはメソッドのシグネチャのサブシグニチャであるm2かのいずれか。

  • m2同じシグネチャを有しm1、または

  • 署名がm1消失(同じである§4.6の署名)m2

二メソッドのシグネチャm1m2しているオーバーライド相当いずれかIFF m1のサブシグニチャであるm2か、m2のサブシグニチャですm1

内型パラメータなしRegistryでこの方法は、EntityRegistryそれがオーバーライドとして見られないように、ベース・インターフェース・メソッドのサブシグニチャを有していません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=189933&siteId=1