无法从Object转换为List,但它已经是List?

时间:2015-07-25 01:39:02

标签: java list object arraylist casting

我似乎无法理解为什么编译器告诉我无法从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();
    }
}

3 个答案:

答案 0 :(得分:3)

clone()返回类型为Object的引用(因此与方法的返回类型不兼容)。你可以演员,但做这样的事情更具惯用性:

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

答案 1 :(得分:2)

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

public Object clone()

因此,此语句return ((ArrayList<String>)subscribed).clone();从预期返回List的方法返回一个Object类型。

因此,编译器抱怨它。

您应该将subscribed.clone()投射到ArrayList<String>并返回此值。

这适用于您的public List<String> getSubscribed() {...}方法

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

答案 2 :(得分:1)

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

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

require 'rails_helper'
RSpec.describe FeatureUpdatesController, type: :controller do
  describe "PUT #backlog" do
    create(:user) && sign_in(user)
    it "updates deploy_status to backlog" do
      feature = FactoryGirl.create(:feature)
      put :backlog, id: feature.id
      expect(feature.deploy_status).to eq("backlog")
    end
  end