DeclaredTypeImpl.java
package net.florianschoppmann.java.reflect;
import javax.annotation.Nullable;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeVisitor;
import java.util.List;
import java.util.Objects;
final class DeclaredTypeImpl extends AnnotatedConstructImpl implements ReflectionTypeMirror, DeclaredType {
private final ReflectionTypeMirror enclosingType;
private final TypeElementImpl typeElement;
private final ImmutableList<? extends ReflectionTypeMirror> typeArguments;
DeclaredTypeImpl(ReflectionTypeMirror enclosingType, TypeElementImpl typeElement,
List<? extends ReflectionTypeMirror> typeArguments) {
Objects.requireNonNull(enclosingType);
Objects.requireNonNull(typeElement);
Objects.requireNonNull(typeArguments);
this.enclosingType = enclosingType;
this.typeElement = typeElement;
this.typeArguments = ImmutableList.copyOf(typeArguments);
}
@Override
public boolean equals(@Nullable Object otherObject) {
if (this == otherObject) {
return true;
} else if (otherObject == null || getClass() != otherObject.getClass()) {
return false;
}
DeclaredTypeImpl other = (DeclaredTypeImpl) otherObject;
return enclosingType.equals(other.enclosingType)
&& typeElement.equals(other.typeElement)
&& typeArguments.equals(other.typeArguments);
}
@Override
public int hashCode() {
return Objects.hash(enclosingType, typeElement, typeArguments);
}
@Override
public String toString() {
return ReflectionTypes.getInstance().toString(this);
}
@Override
public <R, P> R accept(TypeVisitor<R, P> visitor, @Nullable P parameter) {
return visitor.visitDeclared(this, parameter);
}
@Override
public TypeElementImpl asElement() {
return typeElement;
}
@Override
public ReflectionTypeMirror getEnclosingType() {
return enclosingType;
}
@Override
public List<? extends ReflectionTypeMirror> getTypeArguments() {
return typeArguments;
}
@Override
public TypeKind getKind() {
return TypeKind.DECLARED;
}
}