我认为你想要做的是:
public static <T> String getCanonicalName() {
return T.class.getCanonicalName();
}
Run Code Online (Sandbox Code Playgroud)
但我确信您已经发现这是行不通的。这是因为 Java 泛型依赖于类型擦除。也就是说,T仅在编译时存在。在运行时,T不再可访问。
通常,要执行此操作,您必须像在第一个示例中那样使用该类型的实例。
在了解你问题的真实性质后,我不会直接回答。
我见过像下面这样的某些“黑客行为”
static String ClassName = Thread.currentThread().getStackTrace[0].getClassName();
Run Code Online (Sandbox Code Playgroud)
这获取了类的名称,但我很确定它不会与 返回的名称相同getCanonicalName(),而且我真的不知道如何将 的输出转换getClassName()为 的输出getCanonicalName().
我认为 Java 语言有一个变化,这确实可以帮助开发人员编写直观的代码:如果可以添加某种self关键字来引用当前类,那么它会允许您编写一些东西,从而简化像您这样的任何场景喜欢self.class.getCanonicalName()。但是,就目前情况而言,我们没有这样的能力,所以你想做的事情是不可能直接实现的。
还有其他可能的解决方法。例如,您可以尝试以下操作:
static String ClassName = null;
public Foo() {
if(ClassName == null)
ClassName = this.getClass().getCanonicalName();
}
Run Code Online (Sandbox Code Playgroud)
但这要求你的类是可构造的,这并不总是可取的。如果我们有一个关键字的话,它也不会那么简单self。