用于实例的“输入”类型是否可能MyClass<Input>
实际上是Integer
我现在正在运行的这个实例?例如,我有:
class MyProcessor<Input, Output> {
public void initialize() {
if (Long.class.isAssignableFrom(Input.class))
....
}
}
IntelliJ 告诉我不能在“Input.class”上“从类型变量中选择”。
用于实例的“输入”类型是否可能MyClass<Input>
实际上是Integer
我现在正在运行的这个实例?例如,我有:
class MyProcessor<Input, Output> {
public void initialize() {
if (Long.class.isAssignableFrom(Input.class))
....
}
}
IntelliJ 告诉我不能在“Input.class”上“从类型变量中选择”。
您找不到泛型类型,因为有关它的信息在运行时丢失。
它只是用于在模板类上进行强制转换的提示。
如果您愿意通过构造函数传递类型,那么您可以在字段中保留该类型,例如
public class MyClass<T> {
private final Class<T> clazz;
...
public MyClass(Class<T> clazz, ...) {
this.clazz = clazz;
...
}
...
public void initialize() {
if (Long.class.isAssignableFrom(clazz))
....
}
}
除此之外,由于类型擦除,信息被丢弃
我似乎已经找到了针对与先前答案相矛盾的特定案例的解决方案。这是代码(有效):
interface Processor<I,O>
{
public O process();
}
abstract class SimpleProcessImpl<I,O> implements Processor<I,O>
{
List<Processor> _upstream = new ArrayList<Processor>();
@SuppressWarnings("unchecked")
public I getInput()
{
Object value = _upstream.get(0).process();
ParameterizedType t = (ParameterizedType) getClass().getGenericSuperclass();
Class dstClass = (Class) t.getActualTypeArguments()[0];
Class srcClass = value.getClass();
System.out.println(srcClass.getName() + " -> " + dstClass.getName());
if (dstClass == String.class && srcClass == String.class) {
return (I) value;
}
if (dstClass == String.class) {
return (I) value.toString();
}
if (srcClass == String.class && dstClass == Integer.class) {
String valueStr = (String) value;
Integer valueInt = Integer.parseInt(valueStr);
return (I) valueInt;
}
if (srcClass == String.class && dstClass == Long.class) {
String valueStr = (String) value;
Long valueInt = Long.parseLong(valueStr);
return (I) valueInt;
}
return (I) value;
}
}