Copyright (c) 2000, 2016 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
/*******************************************************************************
* Copyright (c) 2000, 2016 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types;
public final class ExtendsWildcardType extends WildcardType {
protected ExtendsWildcardType(TypeEnvironment environment) {
super(environment);
}
@Override
public int getKind() {
return EXTENDS_WILDCARD_TYPE;
}
@Override
public TType getErasure() {
return fBound.getErasure();
}
@Override
public TType[] getSubTypes() {
return new TType[] { fBound };
}
@Override
protected boolean doCanAssignTo(TType lhs) {
switch (lhs.getKind()) {
case ARRAY_TYPE:
case STANDARD_TYPE:
case PARAMETERIZED_TYPE:
case RAW_TYPE:
return getBound().canAssignTo(lhs);
case UNBOUND_WILDCARD_TYPE:
return true;
case SUPER_WILDCARD_TYPE:
case EXTENDS_WILDCARD_TYPE:
return ((WildcardType)lhs).checkAssignmentBound(getBound());
case TYPE_VARIABLE:
return ((TypeVariable)lhs).checkAssignmentBound(getBound());
case CAPTURE_TYPE:
return ((CaptureType)lhs).checkLowerBound(this);
default:
return false;
}
}
@Override
protected boolean checkTypeArgument(TType rhs) {
switch(rhs.getKind()) {
case ARRAY_TYPE:
case STANDARD_TYPE:
case PARAMETERIZED_TYPE:
return rhs.canAssignTo(getBound());
case RAW_TYPE:
// unchecked conversion not allowed here; fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=127583
return ! getBound().isParameterizedType() && rhs.canAssignTo(getBound());
case UNBOUND_WILDCARD_TYPE:
return getBound().isJavaLangObject();
case EXTENDS_WILDCARD_TYPE:
return ((ExtendsWildcardType)rhs).getBound().canAssignTo(getBound());
case SUPER_WILDCARD_TYPE:
return getBound().isJavaLangObject();
case TYPE_VARIABLE:
return rhs.canAssignTo(getBound());
case CAPTURE_TYPE:
return checkTypeArgument(((CaptureType)rhs).getWildcard());
default:
return false;
}
}
@Override
protected boolean checkAssignmentBound(TType rhs) {
// ? extends Number is a set of all subtyes of number and number.
// so the only thing that can be assigned is null since null is
// a sub type of everything
return rhs.isNullType();
}
@Override
public String getName() {
return internalGetName("extends"); //$NON-NLS-1$
}
@Override
protected String getPlainPrettySignature() {
return internalGetPrettySignature("extends"); //$NON-NLS-1$
}
}