2012-11-15 2 views
3

Java에서 다음 정보가있는 경우 : List.class, Map.class, Integer.class 및 일부 객체의 foo 인스턴스가 있습니다. List<Map<Integer, Integer>>foo을 전송할 수 있나요? 나는 타입 소거로 인한 것이 아니라 비슷한 것을 성취 할 수있는 또 다른 방법이 있는지 궁금해합니다.제네릭을 사용하는 공변 캐스팅

편집 : 더 많은 문맥을 제공합니다. 나는 (객체와 메트릭으로 구성된) 질의를 취할 수 있고 원하는 메트릭을 출력 할 수있는 응용 프로그램을 작성하고 있습니다. 예는 "목록의 요소 합계"입니다. 클라이언트는 앱에 자신을 등록하고 일부 객체 유형 (예 : 목록의 합계)에 대해 특정 메트릭 유형을 제공 할 수 있다는 것을 방송하는 제공자를 작성해야합니다. 앱이 검색어를 수신하면 올바른 제공 업체와 일치하고 그에 대한 calculate 메소드가 호출됩니다.

제네릭이 없으면 간단합니다. 객체의 모든 인스턴스에 대한 표준 유형은 해당 클래스입니다. 그래서 쿼리의 객체를 Object으로 처리하고 class을 사용하여 객체의이 인스턴스를 제공 할 수있는 공급자를 찾습니다. 측정 항목과 비슷합니다.

제네릭을 소개합니다 ... 요소가 Integer 인 경우 내 측정 항목 f을 목록의 요소 합계로 정의하고 요소가 Double 인 경우 해당 제품을 정의한다고 가정 해 보겠습니다. List<Integer>에 대해 제공하는 제공자 2 개와 List<Double>에 대해 제공하는 제공자 1 개가 필요합니다. 하지만 타입 소거로 인해 표준 타입 class을 직접 사용할 수 없습니다. 그래서 관련 클래스 (List.classInteger.class 또는 List.classDouble.class)를 저장하고 클래스의 튜플을 사용하여 공급자를 일치시킵니다.

따라서 calculate 메서드에서는 Object의 공변 캐스팅을 공급자가 처리하는 적절한 형식으로 수행해야합니다.

아마도이 문제에 대한 잘못된 접근 방법을 취하고 있습니까? 당신이 무엇을 포함하는 개체를 알고있는 경우 (

List<Map<Integer, Integer>> fooList = List.class.cast(foo); 

그것은 때문에 안전하지 않은 주조 및 원시 유형의 사용의 컴파일러 경고를 생성합니다,하지만 실제로 안전 :

+0

그것은 명확하지 않다가 세'클래스 '객체 인 경우 당신은 모릅니다, 어떤 경우에 당신은 정확합니다, 그것은 불가능합니다. – Affe

+0

더 많은 동사를 제공하십시오. 누가 List >'인스턴스를 생성합니까? 'new' 문을 제어하면 추가 정보를 넣을 수있어 이런 종류의 캐스팅이 가능합니다. 당신이 그것을 제어합니까? – Saintali

+0

위의 편집 내용보기 –

답변

2

당신이 얻을 것이다 가장 가까운이있다 그것은 말한다).

+0

그러나이 경우 "전통적인"주조보다 이점이 없습니까? – Puce

+1

아니요, 컴파일 타임에 유형이없는 경우이 버전을 사용하십시오. –

+0

@SeanPatrickFloyd thx, 내가 정확히 언급 한대로하고 있습니다. 컴파일러 경고가 마음에 들지 않았으므로이 작업을 수행 할 다른 방법이 있는지 알고 싶지 않았습니다. –

2

경고없이 AFAIK. 당신은 당신이 정기적 된 캐스트를 바로 할 수있는 경우에 목록,지도 및 정수의 코드를 작성하는로 알고, 또는 의미하는 경우

List<Map<Integer, Integer>> bar = (List<Map<Integer, Integer>>) foo; 
관련 문제