我想在 java 中实现类似的东西,但出现编译时错误:
The method onMessage(TextMessage, Class) in the type AbstractTestLoader is not applicable for the arguments (TextMessage, Class)
我理解该错误的原因,但我也觉得应该有一些方法可以通过转换或其他方法来实现。
public abstract class AbstractTestLoader<T extends AbstractEntity<T>> {
public void onMessage(TextMessage message) throws Exception {
onMessage(message, this.getClass()); // I want to correct this line in such a way so that I can call below method with actual Class of {T extends AbstractEntity<T>}
}
public void onMessage(TextMessage message, Class<T> clazz) throws Exception {
//here my original logic will go
}
}
最佳答案
应该注意的是,虽然 Java 泛型在运行时被删除,但如果它们存在于类文件中,则只有有限的反射 API 可以检索它们。
这是一个基于这些假设的快速解决方案:
-
AbstractTestLoader
是直接父类(super class)。 - 子类在声明父类(super class)时不使用类型通配符,例如像这样的子类
class GenericLoader<T extends SubclassAbstractEntity<T>> extends AbstractTestLoader<T>
不存在。
代码如下:
public class AbstractTestLoader<T extends AbstractEntity<T>> {
private static final ClassValue<Class<?>> TYPE_PARAMETER_CACHE = new ClassValue<Class<?>>() {
@Override
protected Class<?> computeValue(Class<?> type) {
assert AbstractTestLoader.class.isAssignableFrom(type);
assert type.getSuperclass() == AbstractTestLoader.class;
Type genericSuperclass = type.getGenericSuperclass();
assert genericSuperclass instanceof ParameterizedType;
Type entityType = ((ParameterizedType) genericSuperclass).getActualTypeArguments()[0];
assert entityType instanceof Class<?>;
return (Class<?>) entityType;
}
};
@SuppressWarnings("unchecked")
protected Class<T> getEntityType() {
return (Class<T>) TYPE_PARAMETER_CACHE.get(this.getClass());
}
public void onMessage(Object message) throws Exception {
onMessage(message, getEntityType()); // getting compile time error here
}
public void onMessage(Object message, Class<T> clazz) throws Exception {
//here my original logic will go
}
}
getEntityType
可以在这两个假设失败的子类中被覆盖。
关于java - 用抽象类方法解决Java泛型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42991301/