简体   繁体   中英

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.

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.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM