private static boolean isParameterizedTypeAssignable(ParameterizedType supertype, ParameterizedType type) { Type rawSupertype = supertype.getRawType(); Type rawType = type.getRawType(); if ( !rawSupertype.equals( rawType ) ) { // short circuit when class raw types are unassignable if ( rawSupertype instanceof Class<?> && rawType instanceof Class<?> && !( ( (Class<?>) rawSupertype ).isAssignableFrom( (Class<?>) rawType ) ) ) { return false; } return isSuperAssignable( supertype, type ); } Type[] supertypeArgs = supertype.getActualTypeArguments(); Type[] typeArgs = type.getActualTypeArguments(); if ( supertypeArgs.length != typeArgs.length ) { return false; } for ( int i = 0; i < supertypeArgs.length; i++ ) { Type supertypeArg = supertypeArgs[i]; Type typeArg = typeArgs[i]; if ( supertypeArg instanceof WildcardType ) { if ( !isWildcardTypeAssignable( (WildcardType) supertypeArg, typeArg ) ) { return false; } } else if ( !supertypeArg.equals( typeArg ) ) { return false; } } return true; }
private static boolean isParameterizedTypeAssignable(ParameterizedType supertype, ParameterizedType type) { Type rawSupertype = supertype.getRawType(); Type rawType = type.getRawType(); if ( !rawSupertype.equals( rawType ) ) { // short circuit when class raw types are unassignable if ( rawSupertype instanceof Class<?> && rawType instanceof Class<?> && !( ( (Class<?>) rawSupertype ).isAssignableFrom( (Class<?>) rawType ) ) ) { return false; } return isSuperAssignable( supertype, type ); } Type[] supertypeArgs = supertype.getActualTypeArguments(); Type[] typeArgs = type.getActualTypeArguments(); if ( supertypeArgs.length != typeArgs.length ) { return false; } for ( int i = 0; i < supertypeArgs.length; i++ ) { Type supertypeArg = supertypeArgs[i]; Type typeArg = typeArgs[i]; if ( supertypeArg instanceof WildcardType ) { if ( !isWildcardTypeAssignable( (WildcardType) supertypeArg, typeArg ) ) { return false; } } else if ( !supertypeArg.equals( typeArg ) ) { return false; } } return true; }
return isSuperAssignable( supertype, type );
return isSuperAssignable( supertype, type );