今天我偶然发现了一些我甚至无法编译的Java代码.减少到最低限度,它看起来像这样:
import java.util.List;
interface A {
<T> List<String> foo();
}
interface B {
<T> List<Integer> foo();
}
class C implements A, B {
@Override
public List<?> foo()
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
乍一看,类型参数<T>的foo的方法A和B自看起来不必要T,不使用其他任何地方.无论如何,我发现这在允许冲突的返回值类型在同一个实现中共存起着至关重要的作用:如果<T>省略了一个或两个,则代码不会编译.这里的非工作版本:
import java.util.List;
interface A {
List<String> foo();
}
interface B {
List<Integer> foo();
}
class C implements A, B {
@Override
public List<?> foo()
{
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
我不需要修复上面的代码片段,因为这些只是我用来解释我的观点的例子.我只是很想知道编译器为什么表现不同.有人可以解释一下这些规则究竟有什么不同吗?
假设我有一个json数组数组
String jsonString = [["John","25"],["Peter","37"]];
Run Code Online (Sandbox Code Playgroud)
我想把它变成ArrayList<ArrayList<String>>对象.当我用的时候
Gson.fromJson(jsonString,ArrayList<ArrayList<String>>.class)
它似乎没有用,我通过使用做了一个工作
Gson.fromJson(jsonString,String[][].class)
有一个更好的方法吗?