1

With this code, compiler tells me I have incompatible Types ("required Set< Item> but have Set< Weapon>").

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 {
}

I don't get it, if Weapon is a subInterface of Item, I think I should be able to use it in place of Items.

I can fix the problem by writing

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();
}

Can you explain to me why is this not permitted ?

Fabinout
  • 878
  • 7
  • 25

2 Answers2

0

Not every Item is a Weapon that's why you can not return it as Set<Item>. By using Set<? extends Item> you declare that the Set consist of Item's, but not only Weapon's.

Murat Karagöz
  • 35,401
  • 16
  • 78
  • 107
0

Well, It's simple.

your method is expecting as Set<Item>

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

But you are returning Set<Weapon>.

You cannot return list of child class objects, when it's expecting as base class objects List.

However you can return list of base class objects, when it's expecting as child class objects list. (Co-variant return)

nagendra547
  • 5,672
  • 3
  • 29
  • 43