SpongeAPI
SpongeAPI copied to clipboard
DataManager#getTranslator() with TypeToken
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);
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 TypeToken
s instead, since they store their own generics.