2017-08-21 2 views
1

Avec ce code, le compilateur me dit que j'ai des types incompatibles ("requis Set < Item> mais ont Set < Weapon>").Types incompatibles lors de la déclaration de la sous-classe

import java.util.Set; 

class clazz extends AbstractClass{ 
    private Set<Weapon> items; 

    @Override 
    Set<Item> getItems() { 
     return items; //Incompatible Types here 
    } 
} 

abstract class AbstractClass { 
    abstract Set<Item> getItems(); 
} 

interface Item { 
} 

interface Weapon extends Item { 
} 

Je ne comprends pas, si l'arme est une sous-interface de point, je pense que je devrais pouvoir l'utiliser à la place des objets.

Je peux résoudre le problème en écrivant

import java.util.Set; 

class clazz extends AbstractClass{ 
    private Set<Weapon> items; 

    @Override 
    Set<? extends Item> getItems() { 
     return items; 
    } 
} 

abstract class AbstractClass { 
    abstract Set<? extends Item> getItems(); 
} 

Pouvez-vous me expliquer pourquoi ce n'est pas permis?

+1

Cette réponse de type peut résoudre votre problème. Il a une bonne explication https://stackoverflow.com/a/6319181/7450269 – RootOnChair

Répondre

0

Tous les Item ne correspondent pas forcément à Weapon. Par conséquent, vous ne pouvez pas le retourner comme Set<Item>. En utilisant Set<? extends Item> vous déclarez que l'ensemble se compose de Item, mais pas seulement de Weapon.

0

Eh bien, c'est simple.

votre méthode attend que Set<Item>

Set<Item> getItems() { 
    return items; //Incompatible Types here 
} 

Mais vous revenez Set<Weapon>.

Vous ne pouvez pas renvoyer la liste des objets de classe enfant, lorsqu'elle attend comme liste d'objets de classe de base.

Toutefois, vous pouvez renvoyer la liste des objets de la classe de base, lorsqu'elle est attendue en tant que liste d'objets de classe enfant. (Retour co-variant)