关于强类型:Java – 为什么我不能部分键入变量?

Java - Why can't I partially type a variable?

为什么在用现有变量键入新变量时键入"全部"或"无"?

例如,假设我有一个类型为List>>的变量data,我想把它的值传递给tempData。为什么在决定tempData的类型时,我只限于ListList>>

如果我只想与data的某个"级别"交互,比如说Map级别,我该如何跳到那里呢?例如,为什么我不能执行cx1(8)?

我已经搜索了我的教科书和这个网站,但是我找不到任何能解释这一点的地方。如果我们被允许"部分打字",会出什么问题吗?

我知道我可以先强加EDCOX1,2,但是我很好奇为什么Java有一个全无的方法。


实际上,你可以:诀窍是在你的声明中使用?? extends。以下工作逐渐变得更加具体:

1
2
3
4
5
6
7
8
List<Map<String, ArrayList<String>>> data = null; // Replace null with content

Object temp1 = data;
List<?> temp2 = data;
List<? extends Map<?, ?>> temp3 = data;
List<? extends Map<String, ?>> temp4 = data;
List<? extends Map<String, ? extends ArrayList<?>>> temp5 = data;
List<Map<String, ArrayList<String>>> temp6 = data;

您可以使用Java泛型来替换不需要完整类型信息的类型。类似于此

1
2
3
public static < K, V > List< Map< K, V > > test( List< Map< K, V > > list ) {
    return list;
}

这将允许您完全使用列表和映射类型,而不知道映射的键和值类型是什么,但如果没有更多的类型信息,则无法对映射中包含的类型进行操作。