/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.commons.lang.reflect;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Arrays;
/**
* Provides runtime information about parameterized type.
*
* @author andrew00x
*/
public final class ParameterizedTypeImpl implements ParameterizedType {
private final Type[] typeArguments;
private final Class<?> rawType;
public ParameterizedTypeImpl(Class<?> rawType, Type... typeArguments) {
this.rawType = rawType;
this.typeArguments = new Type[typeArguments.length];
System.arraycopy(typeArguments, 0, this.typeArguments, 0, this.typeArguments.length);
}
@Override
public Type[] getActualTypeArguments() {
return Arrays.copyOf(typeArguments, typeArguments.length);
}
@Override
public Type getRawType() {
return rawType;
}
@Override
public Type getOwnerType() {
return null;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append(rawType.getName());
builder.append('<');
for (int i = 0, length = typeArguments.length; i < length; i++) {
if (i > 0) {
builder.append(", ");
}
builder.append(typeArguments[i] instanceof Class ? ((Class<?>)typeArguments[i]).getName() : typeArguments[i].toString());
}
builder.append('>');
return builder.toString();
}
@Override
public int hashCode() {
int hashCode = 7;
hashCode = 31 * hashCode + rawType.hashCode();
hashCode = 31 * hashCode + Arrays.hashCode(typeArguments);
return hashCode;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof ParameterizedType)) {
return false;
}
ParameterizedType other = (ParameterizedType)o;
return rawType.equals(other.getRawType()) && Arrays.equals(typeArguments, other.getActualTypeArguments());
}
}