1 /******************************************************************************* 2 * Copyright (c) 2000, 2016 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 *******************************************************************************/ 14 package org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types; 15 16 public final class ExtendsWildcardType extends WildcardType { 17 ExtendsWildcardType(TypeEnvironment environment)18 protected ExtendsWildcardType(TypeEnvironment environment) { 19 super(environment); 20 } 21 22 @Override getKind()23 public int getKind() { 24 return EXTENDS_WILDCARD_TYPE; 25 } 26 27 @Override getErasure()28 public TType getErasure() { 29 return fBound.getErasure(); 30 } 31 32 @Override getSubTypes()33 public TType[] getSubTypes() { 34 return new TType[] { fBound }; 35 } 36 37 @Override doCanAssignTo(TType lhs)38 protected boolean doCanAssignTo(TType lhs) { 39 switch (lhs.getKind()) { 40 case ARRAY_TYPE: 41 case STANDARD_TYPE: 42 case PARAMETERIZED_TYPE: 43 case RAW_TYPE: 44 return getBound().canAssignTo(lhs); 45 46 case UNBOUND_WILDCARD_TYPE: 47 return true; 48 case SUPER_WILDCARD_TYPE: 49 case EXTENDS_WILDCARD_TYPE: 50 return ((WildcardType)lhs).checkAssignmentBound(getBound()); 51 52 case TYPE_VARIABLE: 53 return ((TypeVariable)lhs).checkAssignmentBound(getBound()); 54 case CAPTURE_TYPE: 55 return ((CaptureType)lhs).checkLowerBound(this); 56 57 default: 58 return false; 59 } 60 } 61 62 @Override checkTypeArgument(TType rhs)63 protected boolean checkTypeArgument(TType rhs) { 64 switch(rhs.getKind()) { 65 case ARRAY_TYPE: 66 case STANDARD_TYPE: 67 case PARAMETERIZED_TYPE: 68 return rhs.canAssignTo(getBound()); 69 case RAW_TYPE: 70 // unchecked conversion not allowed here; fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=127583 71 return ! getBound().isParameterizedType() && rhs.canAssignTo(getBound()); 72 73 case UNBOUND_WILDCARD_TYPE: 74 return getBound().isJavaLangObject(); 75 case EXTENDS_WILDCARD_TYPE: 76 return ((ExtendsWildcardType)rhs).getBound().canAssignTo(getBound()); 77 case SUPER_WILDCARD_TYPE: 78 return getBound().isJavaLangObject(); 79 80 case TYPE_VARIABLE: 81 return rhs.canAssignTo(getBound()); 82 83 case CAPTURE_TYPE: 84 return checkTypeArgument(((CaptureType)rhs).getWildcard()); 85 86 default: 87 return false; 88 } 89 } 90 91 @Override checkAssignmentBound(TType rhs)92 protected boolean checkAssignmentBound(TType rhs) { 93 // ? extends Number is a set of all subtyes of number and number. 94 // so the only thing that can be assigned is null since null is 95 // a sub type of everything 96 return rhs.isNullType(); 97 } 98 99 @Override getName()100 public String getName() { 101 return internalGetName("extends"); //$NON-NLS-1$ 102 } 103 104 @Override getPlainPrettySignature()105 protected String getPlainPrettySignature() { 106 return internalGetPrettySignature("extends"); //$NON-NLS-1$ 107 } 108 } 109