【问题标题】:The method func(List<Object>) in the type is not applicable for the arguments (List<String>) [duplicate]类型中的方法 func(List<Object>) 不适用于参数 (List<String>) [重复]
【发布时间】:2013-12-19 18:50:34
【问题描述】:

我已经尝试了这两段代码,但我都收到了错误。 下面附上我得到的两个部分和两个错误。 我将不胜感激任何关于为什么会发生这种情况的见解。

示例 1

static List<String> list = new ArrayList<String>();

public static void main(String[] args) {    
  func(list);    
}

private static void func(List<Object> lst) {                
}

错误:

The method func(List&lt;Object&gt;) in the type is not applicable for the arguments (List&lt;String&gt;)

示例 2

static List<Object> list = new ArrayList<Object>();

public static void main(String[] args) {
    func(list);    
}

private static void func(List<String> lst) {
}           

错误:

The method func(List&lt;String&gt;) in the type is not applicable for the arguments (List&lt;Object&gt;)

【问题讨论】:

  • 泛型不是协变的!也就是说,List&lt;Object&gt; 不能替换为 List&lt;String&gt; 或其他方式!
  • 您不能使第二个功能具有相同的语义。如果您将 func 声明为 private static void func(List&lt;?&gt; lst),第一个应该可以工作

标签: java generics collections


【解决方案1】:

您应该基本了解泛型的用途及其工作原理:

List<String> list = new ArrayList<String>();

表示这个列表只能包含字符串列表,并且只能传递给接受List&lt;String&gt;类型参数的方法。而且你不能用它代替List &lt;Object&gt;

为了使函数更通用,您可以使用:

function (List<?> list) {
    //body
} 

【讨论】:

    【解决方案2】:

    该方法不适用,因为StringObject,但List&lt;String&gt; 不是List&lt;Object&gt;

    【讨论】:

      【解决方案3】:

      为什么不能将List&lt;String&gt; 传递给List&lt;Object&gt;

      void bong(List<Object> objs) {
          objs.add ( new Integer(42) );
      }
      List<String> strings = Arrays.toList("foo", bar");
      bong(strings);    // not allowed because ... see next line
      for (String s : strings) print(x.charAt(0));
      

      只有当方法不能修改传递的列表时,这才是安全的。不幸的是,大多数 Java 类都是可变的,大多数 List 实现也是如此。

      为什么不能将List&lt;Object&gt; 传递给List&lt;String&gt;

      void bing(List<String> strings) {
          for (String s : strings) print(x.charAt(0));
      }
      bing(Arrays.toList((Object)1,(Object)2,(Object)3));
      

      【讨论】:

        【解决方案4】:
        static List<Object> list = new ArrayList<Object>();
        
        public static void main(String[] args) {
        
            func(list);
        
        }
        
        private static void func(List<Object> lst) {
        
        }
        

        这应该使用正确的导入(java util)。

        您不能将List&lt;Object&gt; 提供给带有参数List&lt;String&gt; 的方法。它只适用于相同的类型参数。

        【讨论】:

        • 我的问题是为什么?字符串是对象的子类型,所以它应该可以工作......
        • 查看@Heuster 对您的问题的评论。
        • @ronreish 因为它不是类型安全的。
        猜你喜欢
        • 2013-08-20
        • 2016-05-28
        • 1970-01-01
        • 2017-08-15
        • 1970-01-01
        • 2011-12-03
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        相关资源
        最近更新 更多