# Overload by lambda parameter type

**URL:** https://discuss.kotlinlang.org/t/overload-by-lambda-parameter-type/4456
**Category:** Language Design
**Created:** [September 4, 2017, 2:48pm UTC](https://discuss.kotlinlang.org/t/overload-by-lambda-parameter-type/4456 "2017-09-04T14:48:31Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![jaikrish](https://avatars.discourse-cdn.com/v4/letter/j/90ced4/32.png) [@jaikrish](https://discuss.kotlinlang.org/u/jaikrish)
#### Post date: [September 4, 2017, 2:48pm UTC](https://discuss.kotlinlang.org/t/overload-by-lambda-parameter-type/4456/1 "2017-09-04T14:48:31Z")

</div>

Since [overloading by lambda parameter count](https://discuss.kotlinlang.org/t/overload-ambiguity-lambda-parametercount/3916) is allowed, I would like to know why overloading by its **parameter type** is not possible?

```
fun get(path: String, completionHandler: (response: JSONArray) -> Unit)
fun get(path: String, completionHandler: (response: JSONObject, type: String) -> Unit) // Allowed
fun get(path: String, completionHandler: (response: JSONObject) -> Unit) // Error

```

---

<div class="post-metadata">

### Author: ![madmax1028](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/madmax1028/32/3335_2.png) [@madmax1028](https://discuss.kotlinlang.org/u/madmax1028)
#### Post date: [September 4, 2017, 3:06pm UTC](https://discuss.kotlinlang.org/t/overload-by-lambda-parameter-type/4456/2 "2017-09-04T15:06:15Z")

</div>

Because of Java generics erasure. It is a known problem and there is also a solution for such cases:

```auto
@JvmName("handleInts")
fun handle(list: List<Int>) {
	println("handleInts")
}

@JvmName("handleStrings")
fun handle(list: List<String>) {
	println("handleStrings")
}

fun main(args: Array<String>) {
	handle(listOf(1, 2, 3)) // prints: handleInts
	handle(listOf("1", "2", "3")) // prints: handleStrings
}

```

In your case you would do this:

```auto
@JvmName("getJSONArray")
fun get(path: String, completionHandler: (response: JSONArray) -> Unit)
fun get(path: String, completionHandler: (response: JSONObject, type: String) -> Unit) // this one is OK, because it is a diffrent functional type
@JvmName("getJSONObject")
fun get(path: String, completionHandler: (response: JSONObject) -> Unit)

```

---

<div class="post-metadata">

### Author: ![jaikrish](https://avatars.discourse-cdn.com/v4/letter/j/90ced4/32.png) [@jaikrish](https://discuss.kotlinlang.org/u/jaikrish)
#### Post date: [September 5, 2017, 7:21am UTC](https://discuss.kotlinlang.org/t/overload-by-lambda-parameter-type/4456/3 "2017-09-05T07:21:57Z")

</div>

Thank you! It works for the function definition but `@JvmName` annotation is not allowed in the interface it seems.

---

<div class="post-metadata">

### Author: ![madmax1028](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.kotlinlang.org/madmax1028/32/3335_2.png) [@madmax1028](https://discuss.kotlinlang.org/u/madmax1028)
#### Post date: [September 5, 2017, 10:49am UTC](https://discuss.kotlinlang.org/t/overload-by-lambda-parameter-type/4456/4 "2017-09-05T10:49:09Z")

</div>

Unfortunately it seems so:

```auto
@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.FILE)
@Retention(AnnotationRetention.BINARY)
@MustBeDocumented
public annotation class JvmName(val name: String)

```
