/******************************************************************************* * Copyright (c) 2012-2016 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.everrest.core.util; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Arrays; /** * @author andrew00x */ public final class ParameterizedTypeImpl implements ParameterizedType { public static ParameterizedType newParameterizedType(Class<?> rawType, Type... typeArguments) { return new ParameterizedTypeImpl(rawType, typeArguments); } public static ParameterizedType newParameterizedType(Class<?> rawType, Type typeArgument) { return new ParameterizedTypeImpl(rawType, typeArgument); } private final Type ownerType; private final Type[] typeArguments; private final Class<?> rawType; private ParameterizedTypeImpl(Type ownerType, Class<?> rawType, Type typeArgument) { this.ownerType = ownerType; // always null for now this.rawType = rawType; this.typeArguments = new Type[]{typeArgument}; } private ParameterizedTypeImpl(Class<?> rawType, Type typeArgument) { this(null, rawType, typeArgument); } private ParameterizedTypeImpl(Type ownerType, Class<?> rawType, Type[] typeArguments) { this.ownerType = ownerType; // always null for now this.rawType = rawType; this.typeArguments = new Type[typeArguments.length]; System.arraycopy(typeArguments, 0, this.typeArguments, 0, this.typeArguments.length); } private ParameterizedTypeImpl(Class<?> rawType, Type[] typeArguments) { this(null, rawType, typeArguments); } @Override public Type[] getActualTypeArguments() { return typeArguments; } @Override public Type getRawType() { return rawType; } @Override public Type getOwnerType() { return ownerType; } @Override public String toString() { StringBuilder builder = new StringBuilder(); if (ownerType != null) { builder.append(ownerType instanceof Class ? ((Class<?>)ownerType).getName() : ownerType.toString()); builder.append('.'); } 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; if (ownerType != null) { hashCode = 31 * hashCode + ownerType.hashCode(); } 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 (ownerType == null ? other.getOwnerType() == null : ownerType.equals(other.getOwnerType())) && rawType.equals(other.getRawType()) && Arrays.equals(typeArguments, other.getActualTypeArguments()); } }