Question

**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?

Was it helpful?

Solution

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).

OTHER TIPS

  1. primitive : No
  2. array : Only if its a subtype of the parent's array type
  3. or Collection : Same thing as 2
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top