2011-09-05 2 views
0

확인되지 않은 경고 메시지가 나타나는 상황이 있습니다. 나는 억압 경고를 사용할 수 있다는 것을 알고 있지만, 본능은 내가이 스 니펫을 코딩 한 방법을 변경함으로써 피할 수있는 방법이 있다고 말해 준다. 그러나 나는 그 해결책을 표면에 드러내는 것처럼 보이지 않고 신선한 눈으로 할 수 없습니다.체크되지 않은 캐스트 :이 경우 피할 수있는 방법이 있습니까?

//function removes elements from input, orders them and re-adds them 
private <E extends Bus> int orderBuses(ArrayList<E> busList) { 

    Bus busToAdd = null; 

    ... 

    busList.add((E) busToAdd); 

    return 0; 
} 

이 함수는 여러 개의 목록과 함께 호출되며 각 목록에는 Bus를 확장하는 클래스가 들어 있습니다. 버스의 일부인 busToAdd에는 몇 가지 기능이 사용되므로 유형 E 작업을 사용하지 않아야합니다.

경고를 표시하지 않고도이를 재구성하는 방법에 대한 제안 사항이 있으십니까?

편집 : 찾았습니다. busList에 E를 사용할 수 있지만, 결국 동일한 경고로 이어지는 버스에 캐스트해야합니다. 버스 대신 모든 용도로 E를 사용해 볼 수 있습니다. 테스트 한 후에 업데이트하겠습니다.

+2

'때문에, 그것은 당신이이'Bus' 요구하고 싶은 것을 지원해야한다. –

답변

1

Bus에 대한 참조를 E으로 대체 할 수 있어야합니다. 그러면 아무 경고도 없을 것입니다.

예 : E`는`Bus`를 확장

E busToAdd = busList.get(0); 
// ... 
busList.add(busToAdd); 
+0

나는 그것을 시험해 보았다. 문제는 나중에 여러 가지 처리에 사용되기 전에 버스에 할당되었다는 것이다. (나는 언제나 버릇으로 선언에 null을 초기화한다.) 이것은 (E)와 같은 캐스트 없이는 할 수 없으며 같은 경고를받습니다. 입력을 처리하는 방식을 변경하여 전체 양식에서 E 형식으로 유지하는 것이 가능할 수 있습니까? –

+0

예, E 개체의 변수에 목록의 개체를 유지해야합니다. 버스 유형의 객체를 저장해야하는 경우 다른 변수를 사용할 수 있습니까? 지금까지 쓴 것은 아무것도 당신의 방법에서 어느 곳에서든지 체크되지 않은 캐스트를 요구할 것이므로, 당신은 그것을 목표로해야합니다. –

+0

는 E를 사용하기 위해 Bus에 대한 모든 참조를 변경했으며 작동합니다. 그것을 볼 때 그것은 수퍼 타입이 아닌 제네릭 타입 변수를 사용하는 것이 합리적입니다. 이것은 이전에 생각할 수 없었던 대답이었을 가능성이 큽니다. 감사 –

3

E을 사용하지 않는 이유는 무엇입니까?

당신은 당신이 Bus의 일부 몇 가지 방법을 사용하고 있다고하지만, E extends Bus 때문에 당신은뿐만 아니라 EBus '메소드를 호출 할 수 있어야한다.

관련 문제