Vararg vs. array parameter

You can have all 3 with 2 functions, but clients that have an array have to use the spread operator then. If that is something they are unable to understand, then use 3 functions with different names:

fun abcAll(vararg x: String)
fun abcArray(x: Array<String>)
fun abcList(x: List<String>)

Both solutions may not be perfect, but they are your only options given the constraints of the JVM.