How to reference the generic type of a member of an inner class?

I’m curious to understand why testInnerClass fails to compile, citing incompatible types: Object cannot be converted to String.

package test;

import java.util.List;

class Test<
        I extends Test.InnerClass,
        S extends Test.StaticInnerClass,
        O extends OtherClass> {

    void testOtherClass(O other) {
        String firstString = other.strings.get(0); //this works
    }
    
    void testStaticInnerClass(S staticInner) {
        String firstString = staticInner.strings.get(0); //this works
    }
    
    void testInnerClass(I inner) {
        String firstString = inner.strings.get(0); //this fails:
        //"incompatible types: Object cannot be converted to String" 
    }

    static class StaticInnerClass {
        List<String> strings;
    }
    
    class InnerClass {
        List<String> strings;
    }
}

class OtherClass {
    List<String> strings;
}

testStaticInnerClass and testOtherClass work as I would expect but I’m not exactly sure why testInnerClass fails.

Answer

InnerClass is an inner class of Test which expects generic parameters. So you need to update the class declaration as:

class Test<
        I extends Test<I,S,O>.InnerClass,
        S extends Test.StaticInnerClass,
        O extends OtherClass>

The StaticInnerClass, even though inside Test, it is declared static.So as every static method or variable, the static class also does not depend on any state of the class. Hence it is not required to have S extends Test<I,S,O>.StaticInnerClass

Leave a Reply

Your email address will not be published. Required fields are marked *