최근 Eclipse의 nullability 주석을 사용하여 Java 프로젝트를 업데이트하기 시작했습니다. 일부 번역 클래스가 포함 된 JavaFX 기본 프로젝트가 있습니다.형식 주석은 바운드 된 와일드 카드의 어디에 속합니까?
이제 내 LocalizedList에 문서 트리의 요소로 초기화하고 하위 요소를 모두 재귀 적으로 추가합니다. 난 그냥이와 함께 떠나는 경우
@NonNullByDefault
private void locChildren(Styleable c) {
String localizable = getKey(c);
if(localizable != null) {
backingMap.put(c, localizable);
setText(c, localizable);
}
if(c instanceof MenuBar) {
MenuBar mb = (MenuBar)c;
initLoc(mb.getMenus());
} // else if ...
}
@NonNullByDefault
public void initLoc(List<? extends Styleable> s) {
for(Styleable c : s) {
locChildren(c);
}
}
지금, 나는 무섭게 긴 경고 메시지를받을
Null type safety (type annotations): The expression of type 'ObservableList<Menu>' needs unchecked conversion to conform to '@NonNull List<? extends @NonNull Styleable>', corresponding supertype is 'List<Menu>'
이것은 MenuBar#getMenus() 때문에 어떤 Null 허용 주석 주석되지 않고있다, 예상 될 수 있습니다.
@Nullable 주석을 List 자체에 적용한 후에도 문제가 해결되지 않았습니다. 그래서 @ Nullable을 와일드 카드에 추가했습니다. 이것은 내가 혼란스러워하는 것을 우연히 발견 한 곳입니다.
@NonNullByDefault
public void initLoc1(@Nullable List<@Nullable ? extends Styleable> s) {
for(Styleable c : s) {
locChildren(c);
}
}
@NonNullByDefault
public void initLoc2(@Nullable List<@Nullable ? extends @Nullable Styleable> s) {
for(Styleable c : s) {
locChildren(c);
}
}
@NonNullByDefault
public void initLoc3(@Nullable List<? extends @Nullable Styleable> s) {
for(Styleable c : s) {
locChildren(c);
}
}
이 세 가지 선언은 모두 유효하고 잘 컴파일되지만 경고 메시지가 사라집니다.
나는 그것이 실제로 방법 자체에 사용되는, 완전히 두 번째 예를 혼동하고있는 "유형"을 주석으로 첫 번째는 유효 할 것으로 예상했을 것이다.
세 선언 사이의 의미상의 차이점은 무엇이며 왜 세 개는 작동하지만 두 개는 작동하지 않는 이유는 무엇입니까?
컴파일러가 와일드 카드에서 형식 주석을 받아들이는 것에 약간 놀랐습니다. 유형이 아닙니다. 처음 두 경우에 나타나는 경고가 * *와 관련이 없다는 것을 확신합니까? 당신이 여전히 경고를 받는다는 사실에 초점을 맞추는 것이 어렵지 않을 수도 있으며, 그들이 다른 경고라는 사실을 간과 할 수도 있습니다. –
@ 존 내가 제대로 이해했는지는 모르겠지만 세 가지 오류 메시지 (주석이없고 와일드 카드에 주석이 달린 주석이 달린 것)는 별개이지만 목록을 변경하면 <...> -type :'List @NonNull 스타일 가능>''@ NonNullByDefault' 주석과 같이,'List <@Nullable? 스타일 가능>'및'List <@Nullable? @ Nullable 스타일 가능>을 확장합니다. 나머지 경고는 그대로 유지됩니다. – Adowrath
@ 존 아직 추론을 찾지 못했지만 자바 8 JLS에 추가 된 것으로 보인다. [JLS 8, 4.5.1] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.5.1) 및 [JLS 7, 4.5.1 ] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.5.1) – Adowrath