How does using wildcard in return type differ from defined generic type?

Carmine :

I have the following class, which compiles fine

class MyClass<T> {
    MyClass<? extends Number> foo() {
        return new MyClass<Integer>();
    }
}

but when I change my return type to this

class MyClass<T> {
    <R extends Number> MyClass<R> foo() {
        return new MyClass<Integer>();
    }
}

I start getting error on my return statement, saying

incompatible types: MyClass<java.lang.Integer> cannot be converted to MyClass<R>

talex :

it is because for second case

MyClass<Double> d = foo();

is valid call, but for first one is not.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=81520&siteId=1