Java : 타입 안전 - 확인되지 않은 캐스트
-
18-09-2019 - |
문제
내 코드는 다음과 같습니다.
Object[] data = GeneComparison.readData(files);
MyGenome genome = (MyGenome) data[0];
LinkedList<Species> breeds = (LinkedList<Species>) data[1];
링크드리스트에 대한 경고를 제공합니다.
Type safety: Unchecked cast from Object to LinkedList<Species>
MyGenome이 아닌 링크 된 목록에 대해 불평하는 이유는 무엇입니까?
해결책
여기서 :
MyGenome genome = (MyGenome) data[0];
당신은 제네릭을 사용하지 않습니다
그리고 여기
LinkedList<Species> breeds = (LinkedList<Species>) data[1];
당신은 그들을 사용하고 있습니다.
그것은 단지 경고 일뿐입니다. 데이터 배열의 믹싱 유형입니다. 당신이 무엇을하고 있는지 알고 있다면 (두 번째 요소에 두 번째 요소에 Linkedlist ) 경고를 무시할 수 있습니다.
그러나 더 나은 것은 다음과 같은 대상을 갖는 것입니다.
class Anything {
private Object [] data;
public Anything( Object [] data ) {
this.data = data;
}
public Gnome getGnome() {
.....
}
public List<Species> getBreeds() {
......
}
}
올바른 변환 전에 올바른 물건을 반환하는 방법이 필요하므로 다음과 같이 끝납니다.
Anything anything = new Anything( GeneComparison.readData(files) );
MyGenome genome = anything.getGnome(); // similar to data[0]
LinkedList<Species> breeds = anything.getBreeds(); // similar to data[1];
이러한 방법 내에서 적절한 변환을 수행해야합니다.
다른 팁
Java는 비모수 유형 (객체)을 매개 변수화 유형 (LinkedList)에 캐스팅 할 때 이렇게 불평합니다. 그것은 당신에게 그것이 무엇이든 될 수 있다고 말하는 것입니다. 첫 번째 캐스트는 첫 번째 캐스트와 다르지 않습니다. 첫 번째는 그 유형이 아니지만 두 번째는 그렇지 않은 경우 classcastException을 생성한다는 것을 제외하고는 실제로 다르지 않습니다.
그것은 모두 유형의 지우기로 내려집니다. 런타임의 링크 목록은 실제로 링크 사전 목록 일뿐입니다. 당신은 그것에 무엇이든 넣을 수 있으며 첫 번째 예제와 같은 ClasscastException을 생성하지 않습니다.
이 경고를 제거하려면 종종 다음과 같은 작업을 수행해야합니다.
@SuppressWarning("unchecked")
public List<Something> getAll() {
return getSqlMapClient.queryForList("queryname");
}
QueryForList ()가 목록을 반환하는 경우 (비모수 화 된) 내용이 클래스의 무언가임을 알 수 있습니다.
이것의 다른 측면은 자바의 배열이 공분산, 런타임 유형 정보를 유지한다는 의미입니다. 예를 들어:
Integer ints[] = new Integer[10];
Object objs[] = ints;
objs[3] = "hello";
예외를 던질 것입니다. 하지만:
List<Integer> ints = new ArrayList<Integer>(10);
List<Object> objs = (List<Object>)ints;
objs.add("hello");
완벽하게 합법적입니다.