31 package com.google.protobuf;
37 import java.util.List;
102 this.collection = collection;
103 this.javaType = javaType;
105 switch (collection) {
118 boolean primitiveScalar =
false;
126 primitiveScalar =
true;
130 this.primitiveScalar = primitiveScalar;
156 return primitiveScalar;
166 return collection.
isList();
177 return isValidForList(
field);
185 if (!javaType.
getType().isAssignableFrom(clazz)) {
190 Type genericType =
field.getGenericType();
191 if (genericType instanceof ParameterizedType) {
192 types = ((ParameterizedType)
field.getGenericType()).getActualTypeArguments();
194 Type listParameter = getListParameter(clazz,
types);
195 if (!(listParameter instanceof Class)) {
199 return elementType.isAssignableFrom((Class<?>) listParameter);
216 private static final Type[] EMPTY_TYPES =
new Type[0];
234 Type[] genericInterfaces = clazz.getGenericInterfaces();
235 for (
Type genericInterface : genericInterfaces) {
236 if (genericInterface instanceof ParameterizedType) {
237 ParameterizedType parameterizedType = (ParameterizedType) genericInterface;
238 Class<?> rawType = (Class<?>) parameterizedType.getRawType();
239 if (List.class.isAssignableFrom(rawType)) {
240 return genericInterface;
246 Type type = clazz.getGenericSuperclass();
247 if (
type instanceof ParameterizedType) {
248 ParameterizedType parameterizedType = (ParameterizedType)
type;
249 Class<?> rawType = (Class<?>) parameterizedType.getRawType();
250 if (List.class.isAssignableFrom(rawType)) {
271 while (clazz != List.class) {
273 Type genericType = getGenericSuperList(clazz);
274 if (genericType instanceof ParameterizedType) {
276 ParameterizedType parameterizedType = (ParameterizedType) genericType;
277 Type[] superArgs = parameterizedType.getActualTypeArguments();
278 for (
int i = 0;
i < superArgs.length; ++
i) {
279 Type superArg = superArgs[
i];
280 if (superArg instanceof TypeVariable) {
283 TypeVariable<?>[] clazzParams = clazz.getTypeParameters();
284 if (realTypes.length != clazzParams.length) {
285 throw new RuntimeException(
"Type array mismatch");
289 boolean foundReplacement =
false;
290 for (
int j = 0; j < clazzParams.length; ++j) {
291 if (superArg == clazzParams[j]) {
292 Type realType = realTypes[j];
293 superArgs[
i] = realType;
294 foundReplacement =
true;
298 if (!foundReplacement) {
299 throw new RuntimeException(
"Unable to find replacement for " + superArg);
304 Class<?> parent = (Class<?>) parameterizedType.getRawType();
306 realTypes = superArgs;
313 realTypes = EMPTY_TYPES;
314 for (Class<?> iface : clazz.getInterfaces()) {
315 if (List.class.isAssignableFrom(iface)) {
320 clazz = clazz.getSuperclass();
323 if (realTypes.length != 1) {
324 throw new RuntimeException(
"Unable to identify parameter type for List<T>");
338 this.isList = isList;