문제

내 코드는 다음과 같습니다.

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");

완벽하게 합법적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top