if (fSubType.canAssignTo(singleton.fType) && fSuperType.canAssignTo(singleton.fType))
final TType rightErasure= singleton.fType.getErasure(); final TType subErasure= fSubType.getErasure(); final TType superErasure= fSuperType.getErasure(); if (subErasure.isGenericType() || superErasure.isGenericType() || rightErasure.isGenericType()) { if ((rightErasure.equals(subErasure) || ((HierarchyType) subErasure).isSubType((HierarchyType) rightErasure)) && (rightErasure.equals(superErasure) || ((HierarchyType) superErasure).isSubType((HierarchyType) rightErasure))) return this; } if (subErasure.canAssignTo(rightErasure) && superErasure.canAssignTo(rightErasure))
		public final ITypeSet restrictedTo(final ITypeSet set) {			if (set instanceof SuperTypeUniverse) {				return this;			} else if (set instanceof SuperTypeSingletonSet) {				final SuperTypeSingletonSet singleton= (SuperTypeSingletonSet) set;				if (fSubType.canAssignTo(singleton.fType) && fSuperType.canAssignTo(singleton.fType))					return this;				return SuperTypeSet.createTypeSet(fSubType);			} else if (set instanceof SuperTypeTuple) {				return this;			} else if (set instanceof SuperTypeEmptySet) {				return set;			} else				Assert.isTrue(false);			return null;		}