如何绑定只能静态导入的方法的类型变量



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

最新更新