java-classmate icon indicating copy to clipboard operation
java-classmate copied to clipboard

Unintuitive information about member methods wrt return type covariance

Open zdenek-biberle opened this issue 3 years ago • 1 comments

I've recently come across a surprising behaviour regarding MemberResolver's getMemberMethods. Consider the following classes:

interface Foo {}

class Bar implements Foo {}

interface A {
    Foo doSomething();
}

class B {
    public Bar doSomething() {
        return null;
    }
}

class C extends B implements A {}

Notice that C implements A.doSomething() through B.doSomething().

When inspecting the members of C like this:

var typeResolver = new TypeResolver();
var methods = new MemberResolver(typeResolver).resolve(typeResolver.resolve(C.class), null, null).getMemberMethods();

methods will contain a single method - public abstract Foo A.doSomething(). However, this doesn't tell the whole story - notice that B.doSomething actually returns a Bar instead of a Foo. Therefore, in this case I'd expect methods to contain public Bar B.doSomething(), which gives me more information than A.doSomething() does.

zdenek-biberle avatar Apr 01 '21 14:04 zdenek-biberle

@zdenek-biberle I agree, it would seem to me that the declaration from B should have precedence here.

cowtowncoder avatar Apr 02 '21 16:04 cowtowncoder