package tc.oc.commons.core.reflect;
import com.google.common.reflect.TypeParameter;
import com.google.common.reflect.TypeToken;
import com.google.inject.TypeLiteral;
/**
* A {@link TypeParameter} that contains an actual type argument for itself.
* Useful for passing a param -> arg mapping around as a single object.
*/
public abstract class TypeArgument<T> extends TypeParameter<T> {
private final TypeToken<? extends T> actual;
public TypeArgument(TypeToken<? extends T> actual) {
this.actual = actual;
}
public TypeArgument(TypeLiteral<? extends T> actual) {
this(Types.toToken(actual));
}
public TypeArgument(Class<? extends T> actual) {
this(TypeToken.of(actual));
}
public TypeToken<? extends T> actual() {
return actual;
}
}