SpongeAPI icon indicating copy to clipboard operation
SpongeAPI copied to clipboard

DataManager#getTranslator() with TypeToken

Open Lignium opened this issue 5 years ago • 1 comments

Is it possible to create DataManager#getTranslator(TypeToken token) method? I have problems getting a common translator for a whole class of objects. As far as I know, DataTranslator interface itself has DataTranslator#getToken() method, so this information is known to the Sponge core, which means you can make a method with TypeToken.

Here is an example of an error when trying to use DataManager#getTranslator() with Class argument:

// public abstract class SomeClass<T extends SomeClass<T>>
// public final class SomeClassTranslator implements DataTranslator<SomeClass<?>>

// Type mismatch: cannot convert from Optional<DataTranslator<SomeClass>> to Optional<DataTranslator<SomeClass<?>>>
Optional<DataTranslator<SomeClass<?>>> translatorBox = Sponge.getDataManager().getTranslator(SomeClass.class);

Lignium avatar Jun 15 '19 05:06 Lignium

You're using generics wrong... If you have a generic class you're going to need to use the generic type of that class, not the raw type.

So this:

Optional<DataTranslator<SomeClass<?>>> translatorBox = Sponge.getDataManager().getTranslator(SomeClass.class);

Should be

Optional<DataTranslator<SomeClass<?>>> translatorBox = Sponge.getDataManager().getTranslator((Class<SomeClass<?>>) (Class<?>) SomeClass.class);

It's how you'll end up getting a similar case with getting anything generic typed compared to a method taking a class.

But yes, I can change the methods to using TypeTokens instead, since they store their own generics.

gabizou avatar Jun 15 '19 18:06 gabizou