Java中的字段/类名冲突

时间:2015-04-18 15:30:21

标签: java

我有一个名为T的字段(抱歉)T.T有一个静态方法M.我试图调用T的静态方法TM(),但编译器认为我引用了字段,而不是类和失败的错误"非静态变量不能从静态上下文引用"。除了重命名之外,有什么方法我可以明确地指出我想要的是类,而不是变量吗?

class A
{
    T T;
    static void X() { T.M(); }
}

class T
{
    static public void M() { }
}

4 个答案:

答案 0 :(得分:4)

鉴于您的类位于包中,请将包的名称添加到您的T类名称以形成FQCN

package com.stackoverflow;


class A
{
    T T;
    void X() { com.stackoverflow.T.M(); }
}

class T
{
    static public void M() { }
}

另一种解决方案,使用反射

package com.stackoverflow;

import java.lang.reflect.InvocationTargetException;

class A
{
    T T;
    void X() {
        try {
            com.stackoverflow.T.class.getDeclaredMethod("M").invoke(null, null);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

class T
{
    static public void M() {
        System.out.println("M");
    }
}

答案 1 :(得分:0)

您可以使用Class.forName("T") - 获取名为T的类对象。

答案 2 :(得分:0)

你真的应该重命名变量。

如果您的类型在包中,请使用Diego的答案。

如果你真的真的不想重命名变量并且你的类不在包中,你可以用反射来做这个可恶的事情:

Class classT = T.class;
Method staticMethod = classT.getMethod("M", null);
staticMethod.invoke(null);

答案 3 :(得分:0)

只需添加一个选项:

Class.forName( "T" ).getMethod( "M" ).invoke( null );

如果班级名称只是" T"这将有效。 - 没有包裹。