问题
**since java 5;
I know that if in the base class I write:
public Number doSomething(){
...
}
in the child class I can write something like this
@Override
public Integer doSomething(){
...
}
But I have a question.
If in base class method returns - primitive - array - or Collection.
How can I use covariant at this case?
回答1:
There's no covariance between primitives. No primitive type is a sub type of any other. So you can't do this
class Parent {
public int method() {
return 0;
}
}
class Child extends Parent {
public short method() { // compilation error
return 0;
}
}
For the same reason, corresponding array types for int
and short
also are not covariant.
With array types, it's similar to your Number
example
class Parent {
public Number[] method() {
return null;
}
}
class Child extends Parent {
public Integer[] method() {
return null;
}
}
Similarly for Collection
types
class Parent {
public Collection<String> method() {
return null;
}
}
class Child extends Parent {
public List<String> method() {
return null;
}
}
Note the generic type argument has to be compatible (no covariance in generics, except in bounded wildcards).
回答2:
- primitive : No
- array : Only if its a subtype of the parent's array type
- or Collection : Same thing as 2
来源:https://stackoverflow.com/questions/22154572/method-return-value-covariance-for-primitives-is-it-works