2013-08-22 2 views
0

다음은 제 코드입니다. 컴파일러가 컴파일을 거부합니다.일반 메서드가 컴파일되지 않습니다.이 메서드는 인수에 적용되지 않습니다.

private transient List<? extends Map<String, Object>> donnees; 

// ... 

public <M extends Map<String, Object>> void addDonnee(M nouvelleDonnee) { 
    getDonnees().add(nouvelleDonnee); 
} 

public List<? extends Map<String, Object>> getDonnees() { 
    // ... 

    return donnees; 
} 

왜이 오류가 발생합니까?

The method add(capture#4-of ? extends Map<String,Object>) in the type List<capture#4-of ? extends Map<String,Object>> is not applicable for the arguments (M)

편집 나는 내 문제 해결 방법은 다음과 같습니다 :

private transient List<Map<String, Object>> donnees; 

// ... 

public void addDonnee(Map<String, Object> nouvelleDonnee) { 
    getDonnees().add(nouvelleDonnee); 
} 

public List<Map<String, Object>> getDonnees() { 
    // ... 

    return donnees; 
} 

을 이제 컴파일러는 행복입니다! :)

+0

확인 [잭]의 대답 (http://stackoverflow.com/questions/1684121/generics-error-not-applicable-for-the-arguments) – GokcenG

답변

2

모두 ?M이 서브 클래스, 그리고 서로에 스트 가능하지 않을 수 있습니다

는 대신 클래스에 일반적인 매개 변수를 추가 할 수 있습니다. donnees를 선언하십시오 :

private transient List<Map<String, Object>> donnees; 
+0

네가 맞아. 내가 확인 했어야 해. 그러나 운 좋게 그것은한다. –

+0

감사합니다, @DuncanJones. –

1

List에 넣을 수있는 내용은 List<? extends Foo>으로 정의 할 수 없습니다.

자세한 내용은 JDK documentation에서 자세히 설명합니다 (페이지 하단 참조).

+0

당신은 내가해야 의미합니까 이'FooList extends ArrayList '와 같은 클래스를 생성 하시겠습니까? – Stephan

+0

[Dukelink] (http://stackoverflow.com/a/18379657/474189)의 솔루션이 도움이 될 수 있나요? –

3

getDonnees 메서드는 Map<String,Object>을 구현하는 "무언가"목록을 반환합니다. 예를 들어 TreeMap 또는 HashMap의 목록 일 수 있습니다. 알 방법이 없습니다.

목록의 정확한 구성 요소 유형을 모르기 때문에 아무 것도 추가 할 수 없습니다. 예를 들어 TreeMap 목록에 HashMap을 추가하려고 할 수 있습니다.

두 가지 방법은 클래스 선언 예를 하나, 어떻게 든 같은 매개 변수를 사용한다 :

class SomeClass<M extends Map<String, Object>> { 

    public void addDonnee(M nouvelleDonnee) { 
    getDonnees().add(nouvelleDonnee); 
    } 

    public List<M> getDonnees() { 
    // ... 
    return donnees; 
    } 
} 
1

자바는 donnees, addDonneegetDonnees의 유형이 동일한 지 모르기 때문에 불평 . 하나는 List<HashMap<String, Object>> 일 수 있고 나머지는 List<TreeMap<String, Object>> 일 수 있으며 호환되지 않습니다 (List<TreeMap>HashMap을 추가 할 수없고 그 반대의 경우도 가능).

public class SomeClass<T extends Map<String, Object>> 
{ 
    private transient List<T> donnees; 

    public void addDonnee(T nouvelleDonnee) { 
     getDonnees().add(nouvelleDonnee); 
    } 

    public List<T> getDonnees() { 
     return donnees; 
    } 
} 
관련 문제