我有两个名为Matchers
的类,带有静态方法,我需要在第三个类中使用,所以其中一个只能通过静态导入使用。但是,我不能显式指定类型参数(即 <Type> method()
) 用于静态导入的方法。
如何在不必完全限定课程的情况下解决此问题?
你不能。至少在Java中不是(其他一些语言,例如Scala,让你为你导入的类提供一个别名,这有点酷,可以在这种情况下使用)。
在这里,您只需要为两个类或一个类使用完全限定名(并导入另一个)。
在一个文件中使用 2 个同名的类并不是最好的主意,除非您有一个非常好的用例。也许您实际上可以只使用其中一个匹配器来做您想做的事?
我要在这里做一些读心术,但我猜这是类似于Hamcrest/Mockito Matchers的东西?如果是这样,那么在大多数情况下,您应该只使用其中之一。如果你处于非常不幸的情况下,你确实需要两者,那么,好吧,你很不幸:-)
想出了一个非常笨拙的方法,作为完全限定类的替代方案:
只需实现相关类的子类,并在子类上调用父类静态方法。这是允许的,甚至不会生成编译器警告。由于该方法是静态的,因此不涉及虚拟方法的内容。子类只是作为一个别名(所以最好让它私有和最终的东西)。
有一种方法可能看起来有点不干净,但它被标准所涵盖。您可以将局部变量滥用为导入。由于它们的值对于static
方法调用无关紧要,因此可以将它们初始化为null
public class Imports
{
static <T> java.util.List<T> emptyList()
{
System.out.println("Imports.emptyList()");
return java.util.Collections.emptyList();
}
public static void main(String[] args)
{
final java.util.Collections c=null;
final Imports i=null;
System.out.println(c.emptyList());
System.out.println(i.emptyList());
}
}
c.emptyList()
和i.emptyList()
在这里指的是不同的static
方法。您甚至可以插入类型参数,例如 c.<String>emptyList()
.但是某些编译器可能会发出警告,您必须使用此技巧关闭类。但在某些情况下可能没有更好的方法(多次重复限定名称并不总是更好的方法)......