gpt4 book ai didi

java - 无法将泛型方法的结果传递给另一个方法?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:40:02 24 4
gpt4 key购买 nike

我有一个简单的通用方法,它创建一个包含 n 个元素的列表并返回它:

import java.util.*;
class A {
public static <T> List<T> init(int n) {
List<T> l = new ArrayList<T>();
while (n --> 0) l.add(null);
return l;
}
public static void main(String[] args) {
List<String> x = init(5);
f(x);
}
public static void f(List<String> l) {
System.out.println("l: " + l);
}
}

它按预期工作:

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

但是如果我消除额外的变量:

import java.util.*;
class A {
public static <T> List<T> init(int n) {
List<T> l = new ArrayList<T>();
while (n --> 0) l.add(null);
return l;
}
public static void main(String[] args) {
f(init(5));
}
public static void f(List<String> l) {
System.out.println("l: " + l);
}
}

它不再编译

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

为什么?

但这仍然有效:

import java.util.*;
class A {
public static <T> List<T> init(int n) {
List<T> l = new ArrayList<T>();
while (n --> 0) l.add(null);
return l;
}
public static <T> T id(T t) {
return t;
}
public static void main(String[] args) {
List<String> x = init(5);
f(id(x));
}
public static void f(List<String> l) {
System.out.println("l: " + l);
}
}

为什么?

最佳答案

Java 在未明确定义的情况下依靠推理来确定类型变量是什么。

在你的第一个例子中:

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

编译器推断您正在调用 <String> init因为xList<String> .


在你的第二个例子中:

f(init(5));

编译器无法推断您正在调用 <String> init因为您没有明确告诉它(通过 A. <String> init(5) ),也没有将它分配给适当的变量。


在你的第三个例子中:

List<String> x = init(5);
f(id(x));

编译器推断您正在调用 <List<String>> id返回 List<String>f .


编译器对泛型推理不是很聪明。除非您通过使用变量或直接将它们传递给方法明确说明类型参数是什么,否则它将无法弄清楚它们。

如果您对细节感到好奇,这里是 JLS 的相关部分:

关于java - 无法将泛型方法的结果传递给另一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17262199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com