public Type getSpecializedType(Type type) {
		/*
		 * tArray(x), iface -> tArray(x) iff tArray implements iface tArray(x),
		 * tArray(y) -> tArray(x.intersection(y)) tArray(x), other -> tError
		 */
		if (type.getTypeCode() == TC_RANGE) {
			type = ((RangeType) type).getBottom();
		}
		if (type == tNull)
			return this;
		if (type.getTypeCode() == TC_ARRAY) {
			Type elType = elementType
					.intersection(((ArrayType) type).elementType);
			return elType != tError ? tArray(elType) : tError;
		}
		if (type.getTypeCode() == TC_CLASS) {
			ClassInterfacesType other = (ClassInterfacesType) type;
			if (other.clazz == null
					&& implementsAllIfaces(null, arrayIfaces, other.ifaces))
				return this;
		}
		return tError;
	}