0

我有两个Matchers用静态方法调用的类,我需要在第三个类中使用它们,因此其中一个只能通过静态导入使用。但是,我不能<Type> method()为静态导入的方法显式指定类型参数(即)。

我怎样才能解决这个问题而不必完全符合课程资格?

4

3 回答 3

0

你不能。至少不是在 Java 中(其他一些语言,例如 Scala,允许您为导入的类提供别名,这很酷,可以完全在这种情况下使用)。

在这里,您只需要为两个类或一个类使用完全限定名称(并导入另一个类)。

在一个文件中使用 2 个具有相同名称的类并不是最好的主意,除非您有一个非常好的用例。也许您实际上可以只使用其中一个匹配器来做您想做的事情?

我将在这里做一些读心术,但我猜这类似于 Hamcrest/Mockito Matchers 的内容?如果是这样,那么在大多数情况下,您应该可以只使用其中一个。如果您处于非常不幸的情况,您确实需要两者,那么,您很不幸:-)

于 2013-10-18T17:36:28.340 回答
0

想出了一个非常老套的方法,作为完全限定课程的替代方案:

只需实现相关类的子类并在子类上调用父类静态方法。这是允许的,甚至不会生成编译器警告。由于该方法是静态的,因此不涉及虚拟方法。子类只是用作别名(因此最好将其设为私有和最终等)。

于 2013-10-18T17:57:10.493 回答
0

有一种方法可能看起来有点不干净,但它已包含在标准中。您可以滥用局部变量作为导入。由于它们的值对于方法调用无关紧要,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>

于 2013-10-18T18:40:17.333 回答