我有两个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()
. 但是一些编译器可能会发出警告,你必须使用这个技巧关闭一个类。但在某些情况下,可能没有更好的方法(多次重复限定名称并不总是更好的方法)……</p>