【问题标题】:How to bind the type variable of a method that can only be statically imported?如何绑定只能静态导入的方法的类型变量?
【发布时间】:2013-10-18 17:33:57
【问题描述】:

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

我怎样才能解决这个问题而不必完全限定课程?

【问题讨论】:

  • 请举个例子。
  • @SotiriosDelimanolis 我不知道在这种情况下如何举个例子......我基本上想打电话给Matchers.<T> method(),但Matchers已经作为不同的类导入了。
  • How can I work around this without having to fully qualify the class? 你不能。至少,不是 AFAIK。

标签: java generics import


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,它实际上是 Hamcrest 匹配器。我也做出了错误的决定来实现一个名为Matchers 的类,这导致了这种情况。不幸的是,名称不能再更改,因为它是 API 的一部分。
  • 那么不幸的是你处于不幸的位置:-) 除非 API 不能被破坏或“撞到更高版本”这会改变你的班级名称,那么我能提供的最好的建议给你的是用更长的完全限定名称导入 Matchers 类,这样你的代码就会不那么混乱:-)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    有一种方法可能看起来有点不干净,但它已被标准涵盖。您可以滥用局部变量作为导入。由于它们的值对于 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.&lt;String&gt;emptyList()。但是一些编译器可能会发出警告,你必须使用这个技巧关闭一个类。但在某些情况下,可能没有更好的方法(多次重复限定名称并不总是更好的方法)……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 2014-11-09
      • 2012-06-24
      • 2014-05-12
      • 1970-01-01
      相关资源
      最近更新 更多