java - 在泛型类中找不到方法

标签 java generics

我正在尝试创建一个接受通用 Class 的函数,对 Class 的函数进行一些处理,然后返回所述 Class 的实例。

我收到编译器错误:error: cannot select from a type variable - [ERROR] T.getManagers(), T.class); 。这是函数:

public static <T extends Bar> T getFoo(Class<T> fooClass , String person)
{
    T foo = null;
    try
    {
        Configuration config = Configuration.getConfiguration(person);
        foo = (T) Bar.getInstance(config,T.getManagers(), T.class);
    }
    catch (Exception e)
    {
        logger.error("Error", e);
    }
    return foo;
}

编辑:有什么办法可以绕过打电话 Bar.getManagers() ?我试图用泛型做的是,我已经说了 5 个与 Bar 非常相似但不完全相同的类。他们都有getManagers() 。通过使用类似 T.getManagers() 的通用名称我试图绕过在代码中调用显式名称并使用通用名称。

最佳答案

您正在尝试使用 Java 中不允许的结构:

  • 您不能使用 T.getManagers(),因为它是静态方法,并且类 T 在运行时不可用(类型删除)。如果 Bar 类中存在 getManagers() 方法(并且它应该*),则使用 Bar.getManagers() 代替。

  • 出于同样的原因,您不能使用 T.class,类 T 在运行时将不可用。请改用 fooClass

您提供的代码应如下所示:

public static <T extends Bar> T getFoo(Class<T> fooClass , String person) {
    T foo = null;
    try {
        Configuration config = Configuration.getConfiguration(person);
        foo = (T) Bar.getInstance(config, Bar.getManagers(), fooClass);
    } catch (Exception e) {
        logger.error("Error", e);
    }
    return foo;
}

(*) 此方法应该位于 Bar 中,因为它似乎是您在此处使用的常见行为,并且您似乎期望所有 T 都能做到这一点可以扩展Bar。静态方法不存在继承之类的东西。

关于java - 在泛型类中找不到方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23135121/

相关文章:

swift - 如何通过 Result<Credentials> 类型的实例获取值?

c++ - std::thread 使用带有 ref arg 的 lambda 编译失败

java - 如何在 PowerShell 中获取 Java 版本

java - 如何使dicom图像分析应用程序平台的.m独立

java - 通过坐标自定义 child (children)在manager中的位置

c# - 克隆泛型

json - 使用Argonaut创建通用JSON转换器

具有继承性的 Java 接口(interface)

java - 从类路径设置嵌入式 Jetty war

Java - 如何使用相对路径在目录中创建文件