Interop: Can't call method clashing with property name


#1

Hi, I’m getting compile errors when trying to invoke a public Java method with the same name as a private property in the same class (specifically, entrySet in java.util.concurrent.ConcurrentSkipListMap). Here’s a full example:

package com.andrewberls.cslm

import java.util.concurrent.ConcurrentSkipListMap

object Main {
    @JvmStatic
    fun main(args: Array<String>) {
        val m = ConcurrentSkipListMap<String, String>()
        m.put("foo", "bar")
        println(m.entrySet())
    }
}

This fails to compile with the error:

e: /Users/andrew/code/cslm/src/main/kotlin/com/andrewberls/cslm/Main.kt: (10, 19): Expression 'entrySet' of type 'java.util.concurrent.ConcurrentSkipListMap.EntrySet<kotlin.String!, kotlin.String!>!' cannot be invoked as a function. The function invoke() is not found
e: /Users/andrew/code/cslm/src/main/kotlin/com/andrewberls/cslm/Main.kt: (10, 19): Cannot access 'entrySet': it is 'private' in 'ConcurrentSkipListMap'
:compileKotlin FAILED

Looking at the j.u.c source, it appears that entrySet is both a private transient property and a public method.

I’m on Kotlin 1.0.0, Java 8.

Thanks!


#2

It probably has to do with the mapping to kotlin.Map (no pun intended).

It works as expected when you use the property entries:

import java.util.concurrent.ConcurrentSkipListMap

fun main(args: Array<String>) {
    val m = ConcurrentSkipListMap<String, String>()
    m.put("foo", "bar")
    println(m.entries)
}

#3

Ah cool, that does appear to work. Thanks!