4

为什么在使用现有变量键入新变量时会键入全部或不键入?

例如,假设我有一个data类型为的变量List<Map<String, ArrayList<String>>>,我想将其值传递给tempData. 为什么在决定tempData我的类型时仅限于ListList<Map<String, ArrayList<String>>>

如果我只想与某个“关卡”互动data,比如说Map关卡,我怎么跳到那里?例如为什么我不能List<Map> tempData = data

我已经搜索了我的教科书和这个网站,但我找不到任何解释为什么会这样的地方。如果我们被允许“部分输入”,是否会出现问题?

我知道我可以tempData一开始就使用强类型,但我很好奇为什么 Java 有一种全有或全无的方法。

4

2 回答 2

10

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

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;
于 2014-08-13T18:10:01.043 回答
1

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

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

这将让您在不知道映射的键和值类型的情况下完全使用列表和映射类型,但是如果没有更多类型信息,您将无法对映射中包含的类型进行操作。

于 2014-08-13T18:01:44.747 回答