1

次の型階層があるとします。

public class GenericBaseClass<T> { }

public class SpecializedClass<T, E extends Enum<E> & SomeInterface> extends GenericBaseClass<T> { }

public class SomeProvider {
    private static final List<SpecializedClass<Foo, ?>> VALUES =
        Arrays.asList(createValue());

    List<SpecializedClass<Foo, ?>> getValues() {        
        return VALUES;
    }

    private static SpecializedClass<Foo, Bar> createValue() {
        return new SpecializedClass<>();
    }
}

public class Foo {}
public enum Bar implements SomeInterface {}
public interface SomeInterface {}

は、具象型SomeProviderで使用可能な List を公開することになっています。(ここでの例を単純化するために、 type に対して指定された 1 つの具象のみを示します。)SpecializedClassFooBar

https://rules.sonarsource.com/java/RSPEC-1452によると

一般的なワイルドカード型は、戻りパラメーターで使用しないでください

このスニペットは、ソナーによって重大なコードの臭いとしてマークされています。

これまでのところ、ここでワイルドカードを取り除くことができませんでした。ゲッターメソッドをに変更

List<GenericBaseClass<Foo>> getValues() {        
    return VALUES;
}

は警告を回避しますが、クライアントはこのリストに のインスタンスのみが含まれているという情報を失いますSpecializedClass

基本的に、ここで 2 つの質問があります。

  1. この場合、これは本当に悪いコードの匂いですか? ここでこの getter メソッドを使用するクライアントの落とし穴は何でしょうか?

  2. 戻り値の型にワイルドカードを使用しない場合、ゲッターはどのように見えるでしょうか?

ご協力いただきありがとうございます。

4

1 に答える 1