package org.etk.reflect.core;
import java.util.List;
import org.etk.reflect.api.ClassTypeInfo;
import org.etk.reflect.api.ParameterizedTypeInfo;
import org.etk.reflect.api.TypeInfo;
import org.etk.reflect.api.WildcardTypeInfo;
public abstract class AbstractParameterizedTypeInfo<T, M, A, P, F> extends AbstractTypeInfo<T, M, A, P, F> implements ParameterizedTypeInfo {
protected AbstractParameterizedTypeInfo(TypeResolverImpl<T, M, A, P, F> domain) {
super(domain);
}
public String getName() {
return getRawType().getName();
}
public boolean isReified() {
for (TypeInfo typeArgument : getTypeArguments()) {
if (typeArgument instanceof WildcardTypeInfo) {
WildcardTypeInfo wildcardTypeArgument = (WildcardTypeInfo)typeArgument;
if (wildcardTypeArgument.getLowerBounds().isEmpty()) {
switch (wildcardTypeArgument.getUpperBounds().size()) {
case 1:
TypeInfo ti = wildcardTypeArgument.getUpperBounds().get(0);
if (!(ti instanceof ClassTypeInfo)) {
break;
}
ClassTypeInfo cti = (ClassTypeInfo)ti;
if (!cti.getName().equals(Object.class.getName())) {
break;
}
case 0:
continue;
default:
}
}
}
return false;
}
return true;
}
public TypeInfo getOwnerType() {
throw new UnsupportedOperationException();
}
public final int hashCode() {
int hashCode = getRawType().hashCode();
for (TypeInfo typeArgument : getTypeArguments()) {
hashCode = hashCode * 43 + typeArgument.hashCode();
}
return hashCode;
}
public final boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj instanceof ParameterizedTypeInfo) {
ParameterizedTypeInfo that = (ParameterizedTypeInfo)obj;
if (getRawType().equals(that.getRawType())) {
List<TypeInfo> typeArguments = getTypeArguments();
List<? extends TypeInfo> thatTypeArguments = that.getTypeArguments();
if (typeArguments.size() == thatTypeArguments.size()) {
int length = typeArguments.size();
for (int i = 0;i < length;i++) {
TypeInfo typeArgument = typeArguments.get(i);
TypeInfo thatTypeArgument = thatTypeArguments.get(i);
if (!typeArgument.equals(thatTypeArgument)) {
return false;
}
}
}
return true;
}
}
return false;
}
@Override
public final String toString() {
return "ParameterizedType[rawType" + getRawType() + ",typeArguments=" + getTypeArguments() + "]";
}
}