protected Map<JvmTypeParameter, LightweightMergedBoundTypeArgument> initializeTypeParameterMapping() { Map<JvmTypeParameter, LightweightMergedBoundTypeArgument> typeParameterMapping; state.acceptCandidate(expression, this); List<JvmTypeParameter> declaredTypeParameters = getDeclaredTypeParameters(); if (declaredTypeParameters.isEmpty()) { typeParameterMapping = Collections.emptyMap(); } else { typeParameterMapping = initializeTypeParameterMapping(declaredTypeParameters); } return typeParameterMapping; }
@Override public List<LightweightTypeReference> getTypeArguments() { if (typeArguments == null) { List<JvmTypeParameter> typeParameters = getDeclaredTypeParameters(); if (typeParameters.isEmpty() || getTypeParameterMapping().isEmpty()) { typeArguments = Collections.emptyList(); } else { List<LightweightTypeReference> result = Lists.newArrayListWithCapacity(typeParameters.size()); for(JvmTypeParameter parameter: typeParameters) { LightweightMergedBoundTypeArgument typeArgument = getTypeParameterMapping().get(parameter); result.add(typeArgument.getTypeReference()); } typeArguments = result; } } return typeArguments; }
protected void resolveAgainstActualType(LightweightTypeReference declaredType, LightweightTypeReference actualType, final AbstractTypeComputationState state) { if (!actualType.isAny()) { // TODO this(..) and super(..) for generic types List<JvmTypeParameter> typeParameters = getDeclaredTypeParameters(); if (!typeParameters.isEmpty()) { // TODO actualType -(hint for)-> declared type == inferred // declared type -(hint for)-> actual type == expected TypeArgumentFromComputedTypeCollector.resolveAgainstActualType( declaredType, actualType, typeParameters, getTypeParameterMapping(), BoundTypeArgumentSource.EXPECTATION, state.getReferenceOwner()); } } }