2010-02-16 8 views
1

J'ai un morceau de code qui ressemble à ce que j'ai collé ci-dessous:Générique Visibilité des classes internes?

import java.util.LinkedHashMap; 
import java.util.Map; 

public class GenericMagic { 
    GenericMagic() { 
    } 


    private class Container { 
    int doSomething(){ return 42;} 

    @Override 
    public String toString() { 
     return "Container"+doSomething(); 
    } 
    } 

    private class TheCache<String, Container> extends LinkedHashMap<String, Container> { 
    @Override 
    protected boolean removeEldestEntry(Map.Entry<String, Container> eldest) { 
     Container value = eldest.getValue(); 
     value.doSomething();//if I comment this out it compiles 
     System.out.println(value); 
     return false; 
    } 
    } 
} 

Dans ma classe « TheCache », je veux limiter le type générique à un particulier, ce qui est bien, mais quand je obtenir la 'valeur' ​​en tant que conteneur, il n'est en quelque sorte pas typé, en ce sens que je ne peux pas exécuter la méthode doSomething. Pourquoi?

+0

Dang, dès que j'ai posté nous l'avons compris. Si vous supprimez la définition générique de TheCache comme ceci: private class TheCache étend LinkedHashMap puis cela fonctionne. – Kylar

Répondre

3

Il suffit de se débarrasser du bit <String, Container> dans la déclaration de classe:

private class TheCache extends LinkedHashMap<String, Container> { 

Il soignait « String » et « conteneur » comme si elles étaient les identificateurs de type générique (généralement « T »). Donc, il ne savait pas que le conteneur auquel vous faisiez référence était votre classe imbriquée.

+1

Ouais je me suis dit:/Parfois, je suis trop intelligent pour mon propre bien. – Kylar

+0

Comprendre les choses n'est jamais mauvais! :-) –

Questions connexes