Replace this type parametrization by the 'final' type `String`.

2023, Jun 01    

problem

  • java:S4968
public Metaarray(Map<? extends String, ? extends IdSet> m) {
  super(m);
}
  • 문제로 발견된 코드는 ? extends String
    • 에러 메시지를 직역하면 “이 타입 매개변수화를 ‘final’ 타입 String으로 대체하세요”라는 의미로
    • String은 final 클래스이기 때문에 extend가 불가능하기 때문에 그냥 직접 String타입으로 선언하라는 의미

cause

The upper bound of type variables and wildcards should not be "final"
  • Java에서 제네릭 타입 변수 또는 와일드카드의 upper bound로 ‘final’로 지정된 타입을 사용해서는 안 된다는 의미.
  • 하지만 소나큐브에서 문제로 인식한 코드는 사실 와일드카드 범위를 정하고 있기 때문에 유효한 코드로 보이지만, 수정
  • 즉, 해당 생성자는 Map을 매개변수로 받아서 상위 클래스인 HashMap의 생성자를 호출하는데, 이는 매개변수 mString 또는 String의 하위 클래스로 키를 가지고, IdSet 또는 IdSet의 하위 클래스로 값을 가지는 Map 객체를 받을 수 있음을 의미

solved

public Metaarray(Map<String, ? extends IdSet> m) {
    super(m);
}
  • String으로 직접적 선언