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

		Type top, bottom, result;
		bottom = bottomType.getSpecializedType(type);
		top = topType.getGeneralizedType(type);
		if (top.equals(bottom))
			result = top;
		else if (top instanceof ReferenceType
				&& bottom instanceof ReferenceType)
			result = ((ReferenceType) top)
					.createRangeType((ReferenceType) bottom);
		else
			result = tError;

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