mirror of
https://github.com/moparisthebest/JdbcMapper
synced 2024-11-27 19:32:19 -05:00
Fix non-generic array TypeReference for java 6
This commit is contained in:
parent
3fb9559ba7
commit
17a429399c
@ -1,5 +1,6 @@
|
|||||||
package com.moparisthebest.jdbc;
|
package com.moparisthebest.jdbc;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.GenericArrayType;
|
import java.lang.reflect.GenericArrayType;
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
@ -57,16 +58,32 @@ public abstract class TypeReference<T> implements Comparable<TypeReference<T>> {
|
|||||||
this.genericArray = false;
|
this.genericArray = false;
|
||||||
} else if (type instanceof GenericArrayType) {
|
} else if (type instanceof GenericArrayType) {
|
||||||
final Type arrayComponentType = ((GenericArrayType)type).getGenericComponentType();
|
final Type arrayComponentType = ((GenericArrayType)type).getGenericComponentType();
|
||||||
if (arrayComponentType instanceof Class<?>) {
|
if (arrayComponentType instanceof ParameterizedType) {
|
||||||
this.type = null;
|
|
||||||
this.rawType = (Class<?>) arrayComponentType;
|
|
||||||
} else if (arrayComponentType instanceof ParameterizedType) {
|
|
||||||
this.type = (ParameterizedType) arrayComponentType;
|
this.type = (ParameterizedType) arrayComponentType;
|
||||||
this.rawType = (Class<?>) this.type.getRawType();
|
this.rawType = (Class<?>) this.type.getRawType();
|
||||||
|
this.genericArray = true;
|
||||||
|
} else if (arrayComponentType instanceof Class<?>) {
|
||||||
|
/*
|
||||||
|
* java 6 differs from every other version here in a very specific way:
|
||||||
|
*
|
||||||
|
* this code used to be:
|
||||||
|
* this.rawType = (Class<?>) arrayComponentType;
|
||||||
|
* this.genericArray = true;
|
||||||
|
*
|
||||||
|
* for new TypeReference<Long[]>() {}, these were the results:
|
||||||
|
*
|
||||||
|
* java 6 TypeReference{type=null, rawType=class java.lang.Long, genericArray=true}
|
||||||
|
* java 7+ TypeReference{type=null, rawType=class [Ljava.lang.Long;, genericArray=false}
|
||||||
|
*
|
||||||
|
* turns out this block only ever runs for java 6 and not 7+, which is handled automatically by the first
|
||||||
|
* if (type instanceof Class<?>) block, replicate that with a hack for java 6
|
||||||
|
*/
|
||||||
|
this.type = null;
|
||||||
|
this.rawType = Array.newInstance((Class<?>) arrayComponentType, 0).getClass();
|
||||||
|
this.genericArray = false;
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Internal error: TypeReference constructed with unknown type: '" + type + "' class: '" + type.getClass() + "'");
|
throw new IllegalArgumentException("Internal error: TypeReference constructed with unknown type: '" + type + "' class: '" + type.getClass() + "'");
|
||||||
}
|
}
|
||||||
this.genericArray = true;
|
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Internal error: TypeReference constructed with unknown type: '" + type + "' class: '" + type.getClass() + "'");
|
throw new IllegalArgumentException("Internal error: TypeReference constructed with unknown type: '" + type + "' class: '" + type.getClass() + "'");
|
||||||
}
|
}
|
||||||
@ -94,5 +111,14 @@ public abstract class TypeReference<T> implements Comparable<TypeReference<T>> {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
// just need an implementation, not a good one... hence ^^^
|
// just need an implementation, not a good one... hence ^^^
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "TypeReference{" +
|
||||||
|
"type=" + type +
|
||||||
|
", rawType=" + rawType +
|
||||||
|
", genericArray=" + genericArray +
|
||||||
|
'}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user