src/main/java/com/googlecode/objectify/repackaged/gentyref/GenericTypeReflector.java
public static Type getExactFieldType(Field f, Type type) {
		Type returnType = f.getGenericType();
		Type exactDeclaringType = getExactSuperType(capture(type), f.getDeclaringClass());
		if (exactDeclaringType == null) { // capture(type) is not a subtype of f.getDeclaringClass()
			throw new IllegalArgumentException("The field " + f + " is not a member of type " + type);
		}
		return mapTypeParameters(returnType, exactDeclaringType);
	}
public static Type getExactFieldType(Field f, Type type) {
		Type returnType = f.getGenericType();
		Type exactDeclaringType = getExactSuperType(capture(type), f.getDeclaringClass());
		if (exactDeclaringType == null) { // capture(type) is not a subtype of f.getDeclaringClass()
			throw new IllegalArgumentException("The field " + f + " is not a member of type " + type);
		}
		return mapTypeParameters(returnType, exactDeclaringType);
	}
Returns the exact type of the given field in the given type.
This may be different from <tt>f.getGenericType()</tt> when the field was declared in a superclass,
or <tt>type</tt> has a type parameter that is used in the type of the field, or <tt>type</tt> is a raw type.