Comments (12)
You don't need Kotlin to reproduce it. Here's a minimal failing example in Java:
class Dao {
Map<String, ? extends String> map;
}
public class MoshiTest {
@Test
public void testMoshi() throws Exception {
new Moshi.Builder().build().adapter(Dao.class);
}
}
from moshi.
Yup. For strings this is easy. But when the wildcard really means something, we're in trouble. For example, how would we decode this?
Map<String, ? extends Object>
Would we use the base type? That's a bit weird because it'll be asymmetrical. I might be overthinking this.
from moshi.
Maybe we can have a specific use case for simple types like Primitives and Strings
from moshi.
Or final types.
from moshi.
By the way it's exactly the same beaviour for all Generics in kotlin. For instance, For List<Something>
it will generate List<? extends Something>
.
In addition when we register an adapter class for Something
, moshi ignores it because it looks for an adapter for ? extends Something
from moshi.
@swankjesse Maybe you want me to create another issue to fit the need better ?
from moshi.
I stumbled upon the same issue when using kotlin's wildcard collections
I really like what @cypressious suggests, what about treating wildcards such as ? extends FinalType
as FinalType
?
from moshi.
and if I would implement that, would it be sensible to put that into Types.equals
?
from moshi.
in the meantime I'm using this workaround, maybe it'll help someone:
inline fun <reified T : Any> Moshi.Builder.addWithSubtypes(adapter: JsonAdapter<T>): Moshi.Builder =
add(object : JsonAdapter.Factory {
val subtype = Types.subtypeOf(T::class.java)
override fun create(type: Type?,
annotations: MutableSet<out Annotation>?,
moshi: Moshi?): JsonAdapter<T>? =
when (type) {
T::class.java, subtype -> adapter
else -> null
}
})
from moshi.
@adelnizamutdinov nice! Yeah, I think we probably just want to treat ? extends Type
as Type
. I don’t think it’s reasonable to look at the final/nonfinal attribute of the class because that’s often an implementation detail. (Think of Guava’s ImmutableList, which is non-final).
from moshi.
I think Kotlin has relaxed the wildcard emission in class files in later betas of 1.0. I'll check today.
from moshi.
This works in Kotlin 1.0 or newer
from moshi.
Related Issues (20)
- warning: Kapt support in Moshi Kotlin Code Gen is deprecated and will be removed in 2.0. HOT 3
- Backend Internal error: Exception during IR lowering HOT 1
- Update Okio to 3.4.0 or higher HOT 4
- Field serialized despite of the Transient annotation
- Kotlin Duration Adapter fails to be generated with codegen
- Undocumented behavior on serialization of non-constructor property with defaults HOT 12
- Better egonomics when replacing nulls with default values HOT 4
- Alternative Enum adapter with default value HOT 8
- Retrofit / enum class / @Json name specified / @FormUrlEncoded API HOT 1
- Bug with ProGuard and R8 HOT 3
- Out of memory error HOT 2
- Support Kotlin Multiplatform HOT 2
- Classes annotated with @JsonClass(generateAdapter = true) are not obfuscated HOT 1
- Moshi Codegen doesn't work with OpenAPI 3.1.0 HOT 7
- `@JsonClass(generateAdapter = true)` fails when class has field with type `Array<Array<T>>` with default
- KSP2 throws `NoSuchElementException` for data classes with `@JsonAdapter(generateAdapter = true)` HOT 1
- Build software better, together
- KSP2 crash when using @JsonQualifier HOT 3
- JDK9 Modules: module reads package com.squareup.moshi from both com.squareup.moshi.adapters and com.squareup.moshi HOT 1
- Moshi Polymorphic adapter fails on Kotlin 2.0 scripts
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from moshi.