0

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

Amish
  • 45
  • 9
gstackoverflow
  • 36,709
  • 117
  • 359
  • 710

2 Answers2

8

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

Sotirios Delimanolis
  • 274,122
  • 60
  • 696
  • 724
0
  1. primitive : No
  2. array : Only if its a subtype of the parent's array type
  3. or Collection : Same thing as 2
rpax
  • 4,468
  • 7
  • 33
  • 57