次の型階層があるとします。
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 つの具象のみを示します。)SpecializedClass
Foo
Bar
https://rules.sonarsource.com/java/RSPEC-1452によると
一般的なワイルドカード型は、戻りパラメーターで使用しないでください
このスニペットは、ソナーによって重大なコードの臭いとしてマークされています。
これまでのところ、ここでワイルドカードを取り除くことができませんでした。ゲッターメソッドをに変更
List<GenericBaseClass<Foo>> getValues() {
return VALUES;
}
は警告を回避しますが、クライアントはこのリストに のインスタンスのみが含まれているという情報を失いますSpecializedClass
。
基本的に、ここで 2 つの質問があります。
この場合、これは本当に悪いコードの匂いですか? ここでこの getter メソッドを使用するクライアントの落とし穴は何でしょうか?
戻り値の型にワイルドカードを使用しない場合、ゲッターはどのように見えるでしょうか?
ご協力いただきありがとうございます。