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

时间:2013-10-18 17:33:57

标签: java generics import

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

如何在不完全符合课程资格的情况下解决这个问题?

3 个答案:

答案 0 :(得分:0)

你做不到。至少不是用Java(其他一些语言,比如Scala,让你给你导入的一个别名,这个很酷,可以在这种情况下使用)。

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

在一个文件中使用两个具有相同名称的类不是最好的主意,除非你有一个非常好的用例。也许你只能使用其中一个Matchers来实际做你想做的事情吗?

我会在这里阅读一些内容,但我猜这是Hamcrest / Mockito Matchers的内容吗?如果是这样,那么在大多数情况下你应该只使用其中一个。如果你处于非常不幸的情况,你需要两者,那么,你很不幸: - )

答案 1 :(得分:0)

提出一种非常黑客的方式,作为完全符合课程资格的替代方案:

简单地实现一个有问题的类的子类,并在子类上调用父类的静态方法。这是允许的,甚至不会生成编译器警告。由于该方法是静态的,因此不涉及虚拟方法。子类只是作为一个别名(所以最好把它变成私有和最终的东西)。

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