Giter Club home page Giter Club logo

Comments (12)

cypressious avatar cypressious commented on August 23, 2024

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.

swankjesse avatar swankjesse commented on August 23, 2024

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.

mboudraa avatar mboudraa commented on August 23, 2024

Maybe we can have a specific use case for simple types like Primitives and Strings

from moshi.

cypressious avatar cypressious commented on August 23, 2024

Or final types.

from moshi.

mboudraa avatar mboudraa commented on August 23, 2024

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.

mboudraa avatar mboudraa commented on August 23, 2024

@swankjesse Maybe you want me to create another issue to fit the need better ?

from moshi.

meoyawn avatar meoyawn commented on August 23, 2024

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.

meoyawn avatar meoyawn commented on August 23, 2024

and if I would implement that, would it be sensible to put that into Types.equals?

from moshi.

meoyawn avatar meoyawn commented on August 23, 2024

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.

swankjesse avatar swankjesse commented on August 23, 2024

@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.

JakeWharton avatar JakeWharton commented on August 23, 2024

I think Kotlin has relaxed the wildcard emission in class files in later betas of 1.0. I'll check today.

from moshi.

JakeWharton avatar JakeWharton commented on August 23, 2024

This works in Kotlin 1.0 or newer

from moshi.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.