List<String> 作为参数传递时未解析为 List<Object> 参数

问题描述 投票:0回答:1

我在开发过程中遇到了一个奇怪的运行时问题。我在这里简化了问题。

public class Test {
  public static void main(String[] args) {
    List<String> listOfString = ImmutableList.of("a", "s");
    List<Object> listOfObject = ImmutableList.of("a", "s");
    System.out.println("listOfObject = " +  test(listOfObject));
    System.out.println("listOfString = " +  test(listOfString));
  }
  public static String test(List<Object> a){
    return "List"+ a;
  }
  public static String test(Object a){
    return "Object"+ a;
  }
}

我希望这两个方法调用都会调用 test(List) 方法。但事实并非如此。 我收到的输出是

listOfObject = List[a, s]
listOfString = Object[a, s]

从输出中,我可以推断 listOfString 被视为对象,而不是列表。 我需要知道为什么会发生这种情况。 谢谢你的帮助

这里有一点棘手。

如果您有

List<String> myList
,它与方法
List<Object>
不匹配,但它确实与仅包含
Object
的方法匹配。这就是为什么你会得到你正在经历的结果。

你能做什么?

如果你想将方法与列表匹配,可以使用通配符,例如:

public static String test(List<?> a){
    return "List"+ a;
}

然后如果你运行你的代码:

import java.util.List;

public class Test {
  public static void main(String[] args) {
    
    List<Object> listOfObject = List.of("a", "s");
    System.out.println("listOfObject = " +  test(listOfObject));
    List<String> listOfString = List.of("a", "s");
    System.out.println("listOfString = " +  test(listOfString));
  }
  public static String test(List<?> a){
    return "List"+ a;
  }
  public static String test(Object a){
    return "Object"+ a;
  }
}

它将打印

List

此外,我从番石榴中删除了

LmmutableList
,因为 Java 本身有一个本地替代方案
List.of("x", "y")
,但这与答案无关。

相关阅读

您可以阅读更多内容:

java inheritance java-8
1个回答
0
投票

这里有一点棘手。

如果您有

List<String> myList
,它与方法
List<Object>
不匹配,但它确实与仅包含
Object
的方法匹配。这就是为什么你会得到你正在经历的结果。

你能做什么?

如果你想将方法与列表匹配,可以使用通配符,例如:

public static String test(List<?> a){
    return "List"+ a;
}

然后如果你运行你的代码:

import java.util.List;

public class Test {
  public static void main(String[] args) {
    
    List<Object> listOfObject = List.of("a", "s");
    System.out.println("listOfObject = " +  test(listOfObject));
    List<String> listOfString = List.of("a", "s");
    System.out.println("listOfString = " +  test(listOfString));
  }
  public static String test(List<?> a){
    return "List"+ a;
  }
  public static String test(Object a){
    return "Object"+ a;
  }
}

它将打印

List

此外,我从番石榴中删除了

LmmutableList
,因为 Java 本身有一个本地替代方案
List.of("x", "y")
,但这与答案无关。

相关阅读

您可以阅读更多内容:

© www.soinside.com 2019 - 2024. All rights reserved.