Search code examples
kotlinkotlin-java-interop

How to get reference to static class of Java super class in Kotlin


I've got sample third party Java code:

public class ApiClass extends PackagePrivateClass {
}

abstract class PackagePrivateClass {
    public static class StaticClass {
    }
}

So only ApiClass and StaticClass are public. In Java I can get reference to StaticClass with: ApiClass.StaticClass. For the same code in Kotlin I got Unresolved reference: StaticClass. I can't also get reference via PackagePrivateClass, because it's package private (captain obvious). Is there any hack to get reference to StaticClass (it's third party code so I can't simply make PackagePrivateClass public)?

I understand that it's probably 'by design', however it forbids me from using 3p code


Solution

  • It seems the only solution is to build Java wrapper class that your kotlin class can access to.

    public class ApiClass extends PackagePrivateClass {
    
    }
    
    abstract class PackagePrivateClass {
    
        public static class StaticClass {
    
            void instanceFunction() {
    
            }
    
            static void classFunction() {
            }
        }
    }
    

    The adapter java class (StaticClassAdapter.java):

    class StaticClassAdapter {
    
        private static ApiClass.StaticClass staticClass;
    
        void instanceFunction() {
            staticClass.instanceFunction();
        }
    
        static void classFunction() {
            PackagePrivateClass.StaticClass.classFunction();
        }
    }
    

    So in your kotlin code...

    class KotlinClass {
    
        fun main() {
            StaticClassAdapter().instanceFunction()
            StaticClassAdapter.classFunction()
        }
    }