【问题标题】:Can't convert from Object to List, but it already is a List?无法从 Object 转换为 List,但它已经是 List?
【发布时间】:2015-10-15 19:15:21
【问题描述】:

我似乎无法理解为什么编译器告诉我不能从 Object 转换为 List 但它已经是一个 List。有人能指出我没有看到什么吗?

import java.util.List;
import java.util.ArrayList;

public class User {
    private List<String> subscribed;

    public User() {
        this.subscribed = new ArrayList<String>();
    }

    public List<String> getSubscribed() {
        return ((ArrayList<String>)subscribed).clone();
    }
}

【问题讨论】:

标签: java list object arraylist casting


【解决方案1】:

clone() 返回Object 类型的引用(因此与您的方法的返回类型不兼容)。你可以施法,但这样做更符合习惯:

public List<String> getSubscribed() {
    return new ArrayList<String>(subscribed);
}

【讨论】:

  • 谢谢!我什至没有考虑创建一个新的 ArrayList。练习的一部分是熟悉 ArrayList API,我想我可能有点过于热衷于尽可能多地使用 API 方法。
【解决方案2】:

以下是 java.util.ArrayList.clone() 方法的声明

public Object clone()

因此,这条语句 return ((ArrayList&lt;String&gt;)subscribed).clone(); 正在从预期返回 List 的方法中返回一个 Object 类型。

因此,编译器抱怨它。

您应该将subscribed.clone() 转换为ArrayList&lt;String&gt; 并返回此值。

这适用于您的 public List&lt;String&gt; getSubscribed() {...} 方法

return (ArrayList<String>)(subscribed).clone());

【讨论】:

    【解决方案3】:

    clone()是Cloneable接口中声明的方法,其返回类型声明为Object。由于 ArrayList 实现了这个接口,所以它的 clone 方法也返回了一个 Object。

    因此你必须向编译器确​​认你实际上是在返回一个 List,因为据它所知,ArrayList 中的方法 clone() 返回一个 Object:

     public List<String> getSubscribed() {
        return (List<String>)((ArrayList<String>)subscribed).clone();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 2013-06-12
      • 1970-01-01
      相关资源
      最近更新 更多