The main problem is that you cannot throw Box<Tiger>in Box<Cat>, why? You may think this,
A Box<Cat>can contain cats and tigers, but Box<Tiger>can only contain tigers. If you drop Box<Tiger>before Box<Cat>, then you throw BlackCatin Box<Tiger>:
Box<Cat> catBox = tigerBox;
catBox.throwHere(new BlackCat());
and then the tigerBox is damaged.
Let me reformulate your question as:
public abstract class Company<T extends Cat> {
public Box<T> getFavBox() {
}
public Set<Box<T>> getBoxes() {
}
}
Company<? extends Cat> o = new ETCatCompany();
Box<? extends Cat> boxes = o.getFavBox();
Set<Box<? extends Cat>> boxes = o.getBoxes();
As you can see, it o.getFavBox()will work, but o.getBoxes()no, why?
- Cat Box<? extends Cat>, . Box<BlackCat> Set<Box<? extends Cat>>, a Set<Box<Tiger>>.
, :
Cat ^ Tiger => Cat
Box<Cat> ^ BigBox<Cat> => Box<Cat>
Box<Cat> ^ Box<Tiger> => Box<? extends Cat>
Box<Cat> ^ BigBox<Tiger>
=> (Box<Cat> ^ BigBox<Cat>) ^ (BigBox<Cat> ^ BigBox<Tiger>)
=> Box<Cat> ^ BigBox<? extends Cat>
=> Box<? extends Cat> ^ BigBox<? extends Cat>
=> Box<? extends Cat>
Set<Box<Cat>> ^ Set<BigBox<Cat>> => Set<? extends Box<Cat>>
Set<Box<Cat>> ^ Set<Box<Tiger>> => Set<? extends Box<? extends Cat>>
Set<Box<Cat>> ^ Set<BigBox<Tiger>> => Set<? extends Box<? extends Cat>>
? extends Cat ^ ? extends Tiger => ? extends Cat
Box<? extends Cat> ^ BigBox<? extends Cat> => Box<? extends Cat>
Box<? extends Cat> ^ Box<? extends Tiger>
=> ? extends Box<? extends (? extends Cat)>
=> ? extends Box<? extends Cat>
Set<Box<? extends Cat>> ^ Set<BigBox<? extends Cat>>
=> Set<? extends Box<? extends Cat>>
Set<Box<? extends Cat>> ^ Set<Box<? extends Tiger>>
=> Set<? extends Box<? extends Cat>>
Set<Box<? extends Cat>> ^ Set<BigBox<? extends Tiger>>
=> Set<? extends Box<? extends Cat>>
, , (
Map<String, MVR<?1 extends MF>> x1 = o.operation();
Map<String, MVR<?2 extends MF>> x2 = o.operation();
...
Map<String, MVR<?n extends MF>> x2 = o.operation();
, ?
x1 ^ x2 ^ ... ^ xn
=> Map<String, MVR<?1 extends MF>> ^ Map<String, MVR<?2 extends MF>> ^ ...
=> Map<String, ? extends MVR<? extends MF>> ^ ...
...
=> Map<String, ? extends MVR<? extends MF>>
, , ...