if (from instanceof MetaClass) { final MetaClass fromMC = (MetaClass) from; final boolean violatesUpperBound = getConcreteBounds(((MetaWildcardType) to).getUpperBounds()) .filter(bound -> !fromMC.isAssignableTo(bound)) .findAny() .isPresent(); final boolean violatesLowerBound = getConcreteBounds(((MetaWildcardType) to).getLowerBounds()) .filter(bound -> !bound.isAssignableTo(fromMC)) .findAny()
private String getTypeParmsString(final MetaParameterizedType parameterizedType) { final StringBuilder buf = new StringBuilder(512); if (parameterizedType != null && parameterizedType.getTypeParameters().length != 0) { buf.append("<"); for (int i = 0; i < parameterizedType.getTypeParameters().length; i++) { final MetaType typeParameter = parameterizedType.getTypeParameters()[i]; if (typeParameter instanceof MetaParameterizedType) { final MetaParameterizedType parameterizedTypeParameter = (MetaParameterizedType) typeParameter; buf.append(((MetaClass) parameterizedTypeParameter.getRawType()).getFullyQualifiedName()); buf.append(getTypeParmsString(parameterizedTypeParameter)); } else if (typeParameter instanceof MetaWildcardType) { buf.append(((MetaWildcardType) typeParameter).toString()); } else if (typeParameter instanceof MetaTypeVariable) { buf.append(typeParameter.getName()); } else { buf.append(((MetaClass) typeParameter).getFullyQualifiedName()); } if (i + 1 < parameterizedType.getTypeParameters().length) buf.append(", "); } buf.append(">"); } return buf.toString(); }
final MetaType[] upperBounds = ((MetaWildcardType) callParmType).getUpperBounds(); if (upperBounds != null && upperBounds.length == 1 && upperBounds[0] instanceof MetaClass) { resolvedType = (MetaClass) upperBounds[0];
final MetaType[] upperBounds = ((MetaWildcardType) callParmType).getUpperBounds(); if (upperBounds != null && upperBounds.length == 1 && upperBounds[0] instanceof MetaClass) { resolvedType = (MetaClass) upperBounds[0];
if (from instanceof MetaClass) { final MetaClass fromMC = (MetaClass) from; final boolean violatesUpperBound = getConcreteBounds(((MetaWildcardType) to).getUpperBounds()) .filter(bound -> !fromMC.isAssignableTo(bound)) .findAny() .isPresent(); final boolean violatesLowerBound = getConcreteBounds(((MetaWildcardType) to).getLowerBounds()) .filter(bound -> !bound.isAssignableTo(fromMC)) .findAny()
private String getTypeParmsString(final MetaParameterizedType parameterizedType) { final StringBuilder buf = new StringBuilder(512); if (parameterizedType != null && parameterizedType.getTypeParameters().length != 0) { buf.append("<"); for (int i = 0; i < parameterizedType.getTypeParameters().length; i++) { final MetaType typeParameter = parameterizedType.getTypeParameters()[i]; if (typeParameter instanceof MetaParameterizedType) { final MetaParameterizedType parameterizedTypeParameter = (MetaParameterizedType) typeParameter; buf.append(((MetaClass) parameterizedTypeParameter.getRawType()).getFullyQualifiedName()); buf.append(getTypeParmsString(parameterizedTypeParameter)); } else if (typeParameter instanceof MetaWildcardType) { buf.append(((MetaWildcardType) typeParameter).toString()); } else if (typeParameter instanceof MetaTypeVariable) { buf.append(typeParameter.getName()); } else { buf.append(((MetaClass) typeParameter).getFullyQualifiedName()); } if (i + 1 < parameterizedType.getTypeParameters().length) buf.append(", "); } buf.append(">"); } return buf.toString(); }
@Test public void testMethodReturnTypeWithUpperBoundedWildcardParameter() { final MetaClass c = getMetaClass(ClassWithGenericMethods.class); final MetaMethod method = c.getMethod("methodReturningUpperBoundedWildcardCollection", new Class[] {}); // TODO (ERRAI-459) decide whether it's correct to have the type param present or not // then adjust this assertion to strict equality rather than startsWith() assertTrue(method.getReturnType().getFullyQualifiedNameWithTypeParms().startsWith("java.util.Collection")); final MetaType genericReturnType = method.getGenericReturnType(); assertNotNull(genericReturnType); assertTrue("Got unexpected return type type " + genericReturnType.getClass(), genericReturnType instanceof MetaParameterizedType); final MetaParameterizedType mpReturnType = (MetaParameterizedType) genericReturnType; assertEquals(1, mpReturnType.getTypeParameters().length); // Sole type parameter should be <? extends String> assertTrue(mpReturnType.getTypeParameters()[0] instanceof MetaWildcardType); final MetaWildcardType typeParam = (MetaWildcardType) mpReturnType.getTypeParameters()[0]; assertArrayEquals(new MetaType[] {}, typeParam.getLowerBounds()); assertArrayEquals(new MetaType[] { getMetaClass(String.class) }, typeParam.getUpperBounds()); }
@Test public void testMethodReturnTypeWithWildcardParameter() { final MetaClass c = getMetaClass(ClassWithGenericMethods.class); final MetaMethod method = c.getMethod("methodReturningUnboundedWildcardCollection", new Class[] {}); // TODO (ERRAI-459) decide whether it's correct to have the type param present or not // then adjust this assertion to strict equality rather than startsWith() assertTrue(method.getReturnType().getFullyQualifiedNameWithTypeParms().startsWith("java.util.Collection")); final MetaType genericReturnType = method.getGenericReturnType(); assertNotNull(genericReturnType); assertTrue("Got unexpected return type type " + genericReturnType.getClass(), genericReturnType instanceof MetaParameterizedType); final MetaParameterizedType mpReturnType = (MetaParameterizedType) genericReturnType; assertEquals(1, mpReturnType.getTypeParameters().length); // Sole type parameter should be <?> assertTrue(mpReturnType.getTypeParameters()[0] instanceof MetaWildcardType); final MetaWildcardType typeParam = (MetaWildcardType) mpReturnType.getTypeParameters()[0]; assertArrayEquals(new MetaType[] {}, typeParam.getLowerBounds()); assertArrayEquals(new MetaType[] { getMetaClass(Object.class) }, typeParam.getUpperBounds()); }
@Test public void testMethodReturnTypeWithLowerBoundedWildcardParameter() { final MetaClass c = getMetaClass(ClassWithGenericMethods.class); final MetaMethod method = c.getMethod("methodReturningLowerBoundedWildcardCollection", new Class[] {}); // TODO (ERRAI-459) decide whether it's correct to have the type param present or not // then adjust this assertion to strict equality rather than startsWith() assertTrue(method.getReturnType().getFullyQualifiedNameWithTypeParms().startsWith("java.util.Collection")); final MetaType genericReturnType = method.getGenericReturnType(); assertNotNull(genericReturnType); assertTrue("Got unexpected return type type " + genericReturnType.getClass(), genericReturnType instanceof MetaParameterizedType); final MetaParameterizedType mpReturnType = (MetaParameterizedType) genericReturnType; assertEquals(1, mpReturnType.getTypeParameters().length); // Sole type parameter should be <? extends String> assertTrue(mpReturnType.getTypeParameters()[0] instanceof MetaWildcardType); final MetaWildcardType typeParam = (MetaWildcardType) mpReturnType.getTypeParameters()[0]; assertArrayEquals(new MetaType[] { getMetaClass(String.class) }, typeParam.getLowerBounds()); assertArrayEquals(new MetaType[] { getMetaClass(Object.class)}, typeParam.getUpperBounds()); }
@Test public void testFieldWithStringBoundedWildcardTypeParam() throws Exception { final MetaClass metaClass = getMetaClass(ClassWithGenericCollections.class); final MetaField field = metaClass.getDeclaredField("hasWildcardExtendsStringParam"); assertNotNull(field); assertEquals("Collection", field.getType().getName()); assertEquals("java.util.Collection", field.getType().getFullyQualifiedName()); assertEquals("<? extends java.lang.String>", field.getType().getParameterizedType().toString()); assertEquals("java.util.Collection<? extends java.lang.String>", field.getType().getFullyQualifiedNameWithTypeParms()); assertEquals("java.util.Collection", field.getType().getErased().getFullyQualifiedNameWithTypeParms()); assertEquals(1, field.getType().getParameterizedType().getTypeParameters().length); final MetaWildcardType typeParam = (MetaWildcardType) field.getType().getParameterizedType().getTypeParameters()[0]; assertEquals("Should have no lower bound", Arrays.asList(), Arrays.asList(typeParam.getLowerBounds())); assertEquals("Upper bound should be java.lang.String", Arrays.asList(getMetaClass(String.class)), Arrays.asList(typeParam.getUpperBounds())); }