在泛型类中找不到方法

时间:2014-04-17 13:55:09

标签: 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()这样的泛型,我试图绕过调用代码中的显式名称并使用通用名称代替。

3 个答案:

答案 0 :(得分:1)

T.class被禁止构建,因type erasure而无法使用它。请查看workaround

答案 1 :(得分:1)

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

  • 您不能使用T.getManagers(),因为它是一个静态方法,并且类T在运行时将不可用(类型擦除)。如果getManagers()类存在于Bar类中(并且它应该*),那么请改用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 }。静态方法没有继承这样的东西。

答案 2 :(得分:0)

您可以在fooClass对象上使用反射来获取并执行getManagers()方法。如果类没有该方法,它将在运行时失败。

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

这不是一个很好的做法,但应该有用。