public Type intersection(Type type) {
		if (type == tError)
			return type;
		if (type == Type.tUnknown)
			return this;

		Type newBottom = getSpecializedType(type);
		Type newTop = getGeneralizedType(type);
		Type result;
		if (newTop.equals(newBottom))
			result = newTop;
		else if (newTop instanceof ReferenceType
				&& newBottom instanceof ReferenceType)
			result = ((ReferenceType) newTop)
					.createRangeType((ReferenceType) newBottom);
		else
			result = tError;

		if ((GlobalOptions.debuggingFlags & GlobalOptions.DEBUG_TYPES) != 0) {
			GlobalOptions.err.println("intersecting " + this + " and " + type
					+ " to " + result);
		}
		return result;
	}