java - 如何将调用静态导入的泛型方法的结果传递给另一个方法?

标签 java generics type-inference

我有一个简单的函数 B.init:

p/B.java

package p;
import java.util.*;
public class B {
    public static <T> List<T> init(int n) {
        List<T> l = new ArrayList<T>();
        while (n --> 0) l.add(null);
        return l;
    }
}

A.java

import p.B;
import java.util.*;
class A {
    public static void main(String[] args) {
        f(B.<String>init(5));
    }
    public static void f(List<String> l) {
        System.out.println("l: " + l);
    }
}

它按预期工作:

$ javac A.java && java A
l: [null, null, null, null, null]

但我想导入p.B.init静态:

import static p.B.init;
import java.util.*;
class A {
    public static void main(String[] args) {
        f(<String>init(5));
    }
    public static void f(List<String> l) {
        System.out.println("l: " + l);
    }
}

编译失败:

$ javac A.java && java A
A.java:5: illegal start of expression
        f(<String>init(5));
                  ^
A.java:5: ';' expected
        f(<String>init(5));
                      ^
A.java:5: not a statement
        f(<String>init(5));
                       ^
A.java:5: ';' expected
        f(<String>init(5));
                        ^
4 errors
为什么?有没有办法在不导入类并以类名作为前缀的情况下调用静态泛型函数?我知道你可以将其更改为:

        List<String> l = init(5);
        f(l);

但我不想引入另一个变量。您还可以通过强制转换 ( f((List<String>)(Object)init(5)); ) 来完成此操作,但这会导致编译器警告。

只需删除 <String>在 init 导致此错误之前(我问为什么 here ):

$ javac A.java && java A
A.java:5: f(java.util.List<java.lang.String>) in A cannot be applied to (java.util.List<java.lang.Object>)
        f(init(5));
        ^
1 error

最佳答案

Java 中没有语法可以在调用站点指定方法的类型参数,而无需使用其包含的类或实例来限定方法调用。请注意,这与静态导入无关。例如,看一下这段代码:

<T> void x(T x) {}
void y() { this.<Object>x(""); }

根本不涉及静态方法,但问题是相同的:在这种情况下,您无法避免显式的 this

关于java - 如何将调用静态导入的泛型方法的结果传递给另一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263535/

相关文章:

java - 堆外、 native 堆、直接内存和 native 内存有什么区别?

c# - 如何在没有具体实例的情况下使用反射获取类型的静态属性的值

scala - 创建部分应用函数时的类型推断

c++ - 如何显式查看auto类型推断的结果?

lambda - Java 8 类型推断错误,将 lambda 表达式分配给 Object 类型的变量

java - 在Java中复制一些文本后如何获取系统剪贴板图像?

java - Spring hibernate 事务日志记录

java - 如何在redhat中安装maven 2.2.1?

swift - 如何在 Swift 中添加此通用数据类型的扩展?

java - Java 泛型中的类型不匹配错误