【发布时间】:2014-03-09 08:29:17
【问题描述】:
以下方法完美运行
public <T> void fromJsonArray(String jsonString,Type tToken) {
Gson g = new Gson();
T list = g.fromJson(jsonString,tToken);
System.out.println(list);
}
但是我没有具体说明这个方法中的fromJson方法返回的值赋给我没有指定类型的变量list?
我刚刚测试了关于 <T> 从方法的返回类型推断出来的答案的有效性。它似乎没有成功。请查看以下代码。它甚至没有编译
import java.util.*;
class Sample {
public List<String> getT(String s) {
List<String> list = new ArrayList<String>();
list.add(s);
return list;
}
public <T> void test(){
T list = getT("test");
System.out.println(l);
}
public static void main(String[] a) {
new Sample().test();
}
}
再次修改源码并测试,结果编译时出错
public <T> List<T> getT(T s) {
List<T> list = new ArrayList<T>();
list.add(s);
return list;
}
public <T> void test(){
T list = getT("test"); //incompatible types compilation error here
System.out.println(list);
}
Sample1.java:13: error: incompatible types
T list = getT("test");
^
required: T
found: List
where T is a type-variable:
T extends Object declared in method test()
【问题讨论】:
-
也许它内联了变量,因为它在这里没用
-
类型变量可以是您指定的任何非原始类型:任何类类型、任何接口类型、任何数组类型。
-
这是一个很好的问题。我看不出如何从论点中推断出来。
Type是一个非泛型接口,此时没有方法。我想知道编译器是否能够根据返回类型进行推断。用于类型推断的 JLS 很难理解。我个人不知道答案。 -
@BlackPanther。好的,您如何调用该方法?
fromJsonArray? -
@RohitJain 因为它是 void 我想知道他们是否在没有类型参数的情况下调用它(然后 Object 最终被推断为完整的调用......)。