Restore ability of instance creators to create collection and map types. We inadvertently lost this in Gson 2.0 and 2.1. Nobody noticed!
This commit is contained in:
parent
6cca23c172
commit
bb8dca71c4
@ -194,10 +194,6 @@ public final class Gson {
|
||||
this.htmlSafe = htmlSafe;
|
||||
this.prettyPrinting = prettyPrinting;
|
||||
|
||||
TypeAdapterFactory reflectiveTypeAdapterFactory = new ReflectiveTypeAdapterFactory(
|
||||
constructorConstructor, fieldNamingPolicy, excluder);
|
||||
|
||||
ConstructorConstructor constructorConstructor = new ConstructorConstructor();
|
||||
List<TypeAdapterFactory> factories = new ArrayList<TypeAdapterFactory>();
|
||||
|
||||
// built-in type adapters that cannot be overridden
|
||||
@ -242,7 +238,8 @@ public final class Gson {
|
||||
factories.add(ArrayTypeAdapter.FACTORY);
|
||||
factories.add(TypeAdapters.ENUM_FACTORY);
|
||||
factories.add(TypeAdapters.CLASS_FACTORY);
|
||||
factories.add(reflectiveTypeAdapterFactory);
|
||||
factories.add(new ReflectiveTypeAdapterFactory(
|
||||
constructorConstructor, fieldNamingPolicy, excluder));
|
||||
|
||||
this.factories = Collections.unmodifiableList(factories);
|
||||
}
|
||||
|
@ -23,6 +23,9 @@ import com.google.gson.common.TestTypes.Base;
|
||||
import com.google.gson.common.TestTypes.ClassWithBaseField;
|
||||
import com.google.gson.common.TestTypes.Sub;
|
||||
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import java.lang.reflect.Type;
|
||||
@ -79,4 +82,20 @@ public class InstanceCreatorTest extends TestCase {
|
||||
assertTrue(target.base instanceof Sub);
|
||||
assertEquals(Sub.SUB_NAME, ((Sub)target.base).subName);
|
||||
}
|
||||
|
||||
// This regressed in Gson 2.0 and 2.1
|
||||
public void testInstanceCreatorForCollectionType() {
|
||||
class SubArrayList<T> extends ArrayList<T> {}
|
||||
InstanceCreator<List<String>> listCreator = new InstanceCreator<List<String>>() {
|
||||
public List<String> createInstance(Type type) {
|
||||
return new SubArrayList<java.lang.String>();
|
||||
}
|
||||
};
|
||||
Type listOfStringType = new TypeToken<List<String>>() {}.getType();
|
||||
Gson gson = new GsonBuilder()
|
||||
.registerTypeAdapter(listOfStringType, listCreator)
|
||||
.create();
|
||||
List<String> list = gson.fromJson("[\"a\"]", listOfStringType);
|
||||
assertEquals(SubArrayList.class, list.getClass());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user