当前位置: 首页 > 面试题库 >

Java嵌套的通用类型不匹配

南宫浩皛
2023-03-14
问题内容

在以下示例中:

public static void main(String[] args) {

    List<String> b = new ArrayList<String>();
    first(b);
    second(b);

    List<List<String>> a = new ArrayList<List<String>>();
    third(a);
    fourth(a);  // doesnt work

}

private static <T> void first(List<T> a){
    System.out.println("List of T");
}

private static void second(List<?> a){
    System.out.println("List of anything ");
}

private static <T> void third(List<List<T>> a){
    System.out.println("List of a List of T ");
}

private static void fourth(List<List<?>> a){
    System.out.println("List of a List of anything ");
}

为什么对second(b)的调用有效,但对third(a)的调用却无效

我收到以下错误:

The method fourth(List<List<?>>) in the type `TestTest` is not applicable for the arguments (`List<List<String>>`)

问题答案:

如果您希望能够fourth使用自List<List<String>>变量进行调用,则需要将签名更改为此:

private static void fourth(List<? extends List<?>> a){
    System.out.println("List of a List of anything ");
}

将上面的工作,因为不像List<List<?>>List<? extends List<?>>是兼容List<List<String>>。这样想:

List<List<String>> original = null;
List<? extends List<?>> ok  = original; // This works
List<?> ok2                 = original; // So does this
List<List<?>> notOk         = original; // This doesn't

List<Integer> original      = null;
List<? extends Number> ok   = original; // This works
List<?> ok2                 = original; // So does this
List<Number> notOk          = original; // This doesn't

推理很简单。如果你有

private static void fourth(List<List<?>> a) {
    List<?> ohOh = Arrays.asList(new Object());
    a.add(ohOh);
}

然后,如果您 可以这样 调用该方法:

List<List<String>> a = new ArrayList<List<String>>();
fourth(a);
String fail = a.get(0).get(0); // ClassCastException here!


 类似资料:
  • 本页包含内容: 嵌套类型实例 嵌套类型的引用 枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量类型的环境中,方便地定义通用类或结构体来使用,为了实现这种功能,Swift允许你定义嵌套类型,可以在枚举类型、类和结构体中定义支持嵌套的类型。 要在一个类型中嵌套另一个类型,将需要嵌套的类型的定义写在被嵌套类型的区域{}内,而且可以根据需要定义多级嵌套。 嵌套类型实例 下面这个例子定义了一个结

  • 问题内容: 这样编译(1.6) 但这不是 的错误 有人可以解释为什么吗?谢谢 编辑:编辑为结果 问题答案: 因为这会破坏类型安全性:

  • 问题内容: 我想在我的api中提供以下内容: 所以我这样写: 但是java无法解决。 随着代替它的工作原理,但第二个实际上是多余的“事业AbtractThing已定义的类型。所以我喜欢摆脱它。 问题答案: 你不能摆脱它。第二个不是多余的。您希望编译器将第一个解释为类型参数,但事实并非如此。您也可以这样写: 请注意,在这种情况下,它是一个具体的类,而不是类型参数。将此与以下内容进行比较: 请注意,它

  • 问题内容: 我一直在尝试搜索包含嵌套字段的文档。我创建了这样的嵌套映射: 我的搜索如下所示: 但是我收到此错误消息: 编辑 我仍然收到此错误。我正在通过Java执行此操作,因此这是我要创建的文档: 像这样创建索引: 我认为我可能对文档编制了错误的索引。 问题答案: TLDR:输入您的嵌套类型。 假设我们有一个普通类型,并且嵌套了另一个类型: 该行是分配给的嵌套查询所必需的,如下所示: 该行似乎仅在

  • 目前我有这个阵列= 条件: 如果每个嵌套数组index2都相同,那么我想用[0.0 1.0,1.0 2.0,2.0 3.0,3.0 4.0] = [1.0,3.0,5.0,7.0]来求和 我想要的最终结果:[[“efg”, [1.0, 3.0, 5.0, 7.0], “测试”]] 有什么方法或建议来获得这个结果吗?

  • 问题内容: 我想到的是一个涉及嵌套枚举的数据结构,因此我可以执行以下操作: 如果有方法声明: 然后我可以说(适当): 这是我想出的: 和界面: 我想我只是想用Java来完成这种事情的最佳方法,或者是否需要编写一堆if语句来处理单个Drink.values()。有什么帮助吗? 问题答案: 首先,您提供的示例代码在某种程度上违反了“德米特律”-因为COLUMBIAN实例字段仅用于检索标签。同样,通过这