EpoxyModelWithHolder with generics in Kotlin results in `caused by IllegalArgumentException: T has no bounds`
- Dominant language
- Java
- Stars
- 8.6k
- Forks
- 734
- PR merge metrics
- No merged PRs in 30d
Description
Hi,
On Epoxy 3.x I encounter following error:
```
error: Epoxy Processor Exception: Caused by IllegalArgumentException: T has no bounds Stacktrace: com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:161) com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:181) com.airbnb.epoxy.PoetExtensionsKt.toKPoet$default(PoetExtensions.kt:166) com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:193) com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:133) com.airbnb.epoxy.PoetExtensionsKt.toKPoet(PoetExtensions.kt:179) com.airbnb.epoxy.PoetExtensionsKt.toKPoet$default(PoetExtensions.kt:166) com.airbnb.epoxy.KotlinModelBuilderExtensionWriter.buildExtensionsForModel(KotlinModelBuilderExtensionWriter.kt:97) com.airbnb.epoxy.KotlinModelBuilderExtensionWriter.buildExtensionFile(KotlinModelBuilderExtensionWriter.kt:66) com.airbnb.epoxy.KotlinModelBuilderExtensionWriter.generateExtensionsForModels(KotlinModelBuilderExtensionWriter.kt:41) com.airbnb.epoxy.EpoxyProcessor.processRound(EpoxyProcessor.java:204) com.airbnb.epoxy.EpoxyProcessor.process(EpoxyProcessor.java:170)
```
When trying to generate the classes from following setup:
```
@EpoxyModelClass(layout = R.layout.dropdown_layout)
abstract class DropdownEpoxyModel : EpoxyModelWithHolder>() {
@EpoxyAttribute
lateinit var values: List>
@EpoxyAttribute
var selectedValue: T? = null
@EpoxyAttribute(DoNotHash)
var onSelected: ((T) -> Unit)? = null
override fun bind(holder: Holder) {
}
}
class Holder : EpoxyHolder() {
override fun bindView(itemView: View) {
}
}
```
Worth saying is that same code works fine with `2.19.0`.
Gradle version used: 5.6.3
Can you point me what is solution to make this code working on `3.x` version?
Contributor guide
Research direction
Start with the generic reproducer in the issue and inspect PoetExtensions.kt at line 161, following the toKPoet calls in the stack trace. Then trace KotlinModelBuilderExtensionWriter.kt, especially lines 66 and 97, while running annotation processing on the shown EpoxyModelWithHolder setup. Done means Epoxy 3.x processes the model with unbounded T and generates the classes without the IllegalArgumentException.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- kotlin
- Domain
- mobile-dev
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100