【问题标题】:Java - Why can't I partially type a variable?Java - 为什么我不能部分输入变量?
【发布时间】:2014-10-07 05:02:27
【问题描述】:

为什么在用现有变量输入新变量时是输入全部或全部输入?

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

如果我只想与data 的某个“级别”交互,比如Map 级别,我该如何跳到那里?比如为什么我不能List<Map> tempData = data

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

我知道我可以直接输入 tempData 开始,但我很好奇为什么 Java 有一个全有或全无的方法。

【问题讨论】:

  • 因为 Java 不能那样工作。另外,这些是raw types。不要那样做。
  • List<Map<String, ArrayList<String>>> 应该是 List<Map<String, List<String>>>。针对接口而不是实现的代码。
  • @ElliottFrisch 实际上,Java 确实是这样工作的,它只需要特定的语法(见下文)。 :)
  • @DavidConrad 感谢您指出这一点,我没有想到这一点,我从来没有使用过 ArrayList 特定的方法,并且已经清理了它。与您的评论相关的帖子给其他感兴趣的人:Why are variables declared with their interface name in java

标签: java strong-typing weak-typing


【解决方案1】:

实际上,您可以:诀窍是在您的声明中使用?? 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;

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      相关资源
      最近更新 更多