added back element type checks in TypeDescriptor#isAssignable; clarified semantics in javadoc
This commit is contained in:
parent
7dcd71c543
commit
a60cb43c6a
|
|
@ -279,13 +279,30 @@ public class TypeDescriptor {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns true if an object of this type can be assigned to a reference of the given type.
|
||||
* @param typeDescriptor the descriptor for the target type
|
||||
* Returns true if an object of this type descriptor can be assigned to the location described by the given type descriptor.
|
||||
* For example, valueOf(String.class).isAssignableTo(valueOf(CharSequence.class)) returns true because a String value can be assigned to a CharSequence variable.
|
||||
* On the other hand, valueOf(Number.class).isAssignableTo(valueOf(Integer.class)) returns false because, while all Integers are Numbers, not all Numbers are Integers.
|
||||
* <p>
|
||||
* For arrays, collections, and maps, element and key/value types are checked if declared.
|
||||
* For example, a List<String> field value is assignable to a Collection<CharSequence> field, but List<Number> is not assignable to List<Integer>.
|
||||
* @return true if this type is assignable to the type represented by the provided type descriptor.
|
||||
* @see #getObjectType()
|
||||
*/
|
||||
public boolean isAssignableTo(TypeDescriptor typeDescriptor) {
|
||||
return typeDescriptor.getObjectType().isAssignableFrom(getObjectType());
|
||||
boolean typesAssignable = typeDescriptor.getObjectType().isAssignableFrom(getObjectType());
|
||||
if (!typesAssignable) {
|
||||
return false;
|
||||
}
|
||||
if (isArray()) {
|
||||
return getElementTypeDescriptor().isAssignableTo(typeDescriptor.getElementTypeDescriptor());
|
||||
} else if (isCollection()) {
|
||||
return isNestedAssignable(getElementTypeDescriptor(), typeDescriptor.getElementTypeDescriptor());
|
||||
} else if (isMap()) {
|
||||
return isNestedAssignable(getMapKeyTypeDescriptor(), typeDescriptor.getMapKeyTypeDescriptor()) &&
|
||||
isNestedAssignable(getMapValueTypeDescriptor(), typeDescriptor.getMapValueTypeDescriptor());
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// indexable type descriptor operations
|
||||
|
|
@ -534,7 +551,14 @@ public class TypeDescriptor {
|
|||
return value != null ? new TypeDescriptor(value.getClass(), null, null, null, annotations) : null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private boolean isNestedAssignable(TypeDescriptor nestedTypeDescriptor, TypeDescriptor otherNestedTypeDescriptor) {
|
||||
if (nestedTypeDescriptor == null || otherNestedTypeDescriptor == null) {
|
||||
return true;
|
||||
}
|
||||
return nestedTypeDescriptor.isAssignableTo(otherNestedTypeDescriptor);
|
||||
}
|
||||
|
||||
private String wildcard(TypeDescriptor typeDescriptor) {
|
||||
return typeDescriptor != null ? typeDescriptor.toString() : "?";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -759,7 +759,7 @@ public class TypeDescriptorTests {
|
|||
@Test
|
||||
public void isAssignableElementTypes() throws Exception {
|
||||
assertTrue(new TypeDescriptor(getClass().getField("listField")).isAssignableTo(new TypeDescriptor(getClass().getField("listField"))));
|
||||
assertTrue(new TypeDescriptor(getClass().getField("isAssignableElementTypes")).isAssignableTo(new TypeDescriptor(getClass().getField("listField"))));
|
||||
assertFalse(new TypeDescriptor(getClass().getField("isAssignableElementTypes")).isAssignableTo(new TypeDescriptor(getClass().getField("listField"))));
|
||||
assertTrue(TypeDescriptor.valueOf(List.class).isAssignableTo(new TypeDescriptor(getClass().getField("listField"))));
|
||||
}
|
||||
|
||||
|
|
@ -768,7 +768,7 @@ public class TypeDescriptorTests {
|
|||
@Test
|
||||
public void isAssignableMapKeyValueTypes() throws Exception {
|
||||
assertTrue(new TypeDescriptor(getClass().getField("mapField")).isAssignableTo(new TypeDescriptor(getClass().getField("mapField"))));
|
||||
assertTrue(new TypeDescriptor(getClass().getField("isAssignableMapKeyValueTypes")).isAssignableTo(new TypeDescriptor(getClass().getField("mapField"))));
|
||||
assertFalse(new TypeDescriptor(getClass().getField("isAssignableMapKeyValueTypes")).isAssignableTo(new TypeDescriptor(getClass().getField("mapField"))));
|
||||
assertTrue(TypeDescriptor.valueOf(Map.class).isAssignableTo(new TypeDescriptor(getClass().getField("mapField"))));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue