【问题标题】:How can I call a Generic method with a type, when it's statically imported?静态导入时,如何调用具有类型的通用方法?
【发布时间】:2010-11-04 10:11:24
【问题描述】:

我发现你可以调用具有特殊类型的泛型方法,例如:

假设我们有一个泛型方法:

class ListUtils {
    public static <T> List<T> createList() {
        return new ArrayList<T>();
    }
}

我们可以这样称呼它:

List<Integer> intList = ListUtils.<Integer>createList();

但是当它是静态导入的时候我们怎么调用它呢?例如:

List<Integer> intList = <Integer>createList();

这不起作用。

【问题讨论】:

标签: java generics static-import


【解决方案1】:

你不能。您必须使用类名来引用它。

似乎有:

void foo(List<String> a) {}

调用foo(createList()) 并不能推断出正确的类型。所以你应该明确地使用类名,比如ListUtils.createList(),或者使用一个中间变量:

List<String> fooList = createList();
foo(fooList);

最后,guavaLists.newArrayList(),所以你最好重复使用它。

【讨论】:

  • 谢谢!我什至没有考虑过这种情况(在参数站点调用)。我只是喜欢番石榴,太棒了!
【解决方案2】:

以下对我有用:

package test;
import java.util.List;
import static test.ListUtils.createList;

public class ListConsumer {
    public static void main(String[] args) {
        List<Integer> list = createList();
        List<String> list2 = createList();
    }
}

【讨论】:

  • 感谢您的澄清:)当时我不太了解类型推断。
【解决方案3】:

你不能。这是 Java 语言语法中的设计缺陷。 Scala 是 JVM 上一种较新的静态类型语言,它解决了这个问题。 (这就是你在 Scala 中的调用方式:val intList: List[Int] = creatList[Int]())。

【讨论】:

    【解决方案4】:

    我相信 Mindas 已经证明这应该适用于推理,您的语法有点偏离。但是我建议你看看 Google Guava,他们有这个确切的方法和其他一些有用的方法。没有意义重新发明轮子:)

    【讨论】:

      【解决方案5】:

      据我所知,静态导入机制的一个缺点是,如果您希望提供形式参数,则必须指定调用对象/类。 Mindas 是正确的,当没有参数时,类型推断机制将使用函数返回值被分配给的类型。然而,当你提供论点时,诀窍就来了。如果您希望避免指定调用对象/类,您可以通过参数转换来输入提示,如下所示:

      public static <E> E foo(E e) {}
      
      Number n = foo((Number)3);
      

      使用类型提示,类型推断将返回 Number 类型的对象,而不是 Integer,否则它会推断。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-13
        • 2021-04-09
        • 2019-11-02
        • 2023-04-05
        • 2016-11-23
        • 2018-10-30
        • 2019-05-27
        相关资源
        最近更新 更多