java - 用抽象类方法解决Java泛型错误

标签 java generics abstract-class generic-type-argument

我想在 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 可以检索它们。

这是一个基于这些假设的快速解决方案:

  1. AbstractTestLoader是直接父类(super class)。
  2. 子类在声明父类(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/

相关文章:

c++ - 无法将字段 'pair' 声明为抽象类型 'System'

java - 显式等待不起作用,Thread.sleep 有效

c# - 有没有办法概括 Action 和 Action<T>?

java - 为什么 try-catch 不解决未经检查的泛型转换中的警告?

c# - 我可以将参数从派生类的默认构造函数传递给基构造函数吗?

c# - 有没有办法让抽象类中的静态只读字段在派生类中实例化?

java - 停止秒表

java - GSON 将数组的数组解析为 Java 对象数组

java - 如何终止从我的 java 应用程序启动的 cmd 进程?

java - 转换为通用类型时 Java 中的警告