【问题标题】:Read and save list of Object using list of interface使用接口列表读取和保存对象列表
【发布时间】:2017-03-31 06:09:22
【问题描述】:

我看过某人的代码,但无法理解它是如何工作的。

作为代码将对象列表保存在接口列表中并且可以将其读回。

请解释它是如何工作的。我们可以将对象保存在接口中(对象实现它的地方)。 AFAIK 界面没有成员。请解释此代码如何保存和检索。

ContactBO 实现 BusinessObject

public class ContactBO implements BusinessObject {

    private String id, fullName, department, ;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFullName() {
        return fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }

    public String getDepartment() {
        return department;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    @Override
    public boolean isSection() {
        // TODO Auto-generated method stub
        return false;
    }

}

BusinessObject 在哪里

public interface BusinessObject {
    boolean isSection();
}

联系人代码保存列表

List<ContactBO> contactList = new Gson().fromJson(jsonArray.toString(),
                new TypeToken<List<ContactBO>>() {}.getType());
        List<BusinessObject> list = new ArrayList<BusinessObject>();
        list.addAll(contactList);

使用接口列表读取 ContactBO 列表

List<ContactBO> contactListItems = (List<ContactBO>) (List<?>) result.list;//where list is public List<BusinessObject> list;

【问题讨论】:

  • 如果您有List&lt;T&gt; list,其中T 是一个接口,则列表的对象可以是实现该接口的any 类的对象。当您将 放入列表时,对象本身不会改变。它们仍然具有与创建时相同的类。请尝试阅读this one等教程。

标签: java android interface


【解决方案1】:

这是我从源头可以理解的。

List<ContactBO> contactList = new Gson().fromJson(jsonArray.toString(),
                new TypeToken<List<ContactBO>>() {}.getType());

这并不意味着

作为代码将对象列表保存在接口列表中并且可以读取它 返回

以上行使用 GSON 将响应转换为 type ContactBOList 对象。 通过实现BusinessObject 接口,ContactBO 仍然是一个类而不是一个接口。

现在是下一行

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

这又创建了一个 type BusinessObject

的列表

现在是以下行。 list.addAll(contactList);ContactList 类型的对象添加到 BusinessObject 类型的超级对象中

【讨论】:

  • ContactBO 仍然是一个类而不是一个接口。很好的竖起大拇指,这意味着实现接口(是一种继承权)
【解决方案2】:

“多态性是对象具有多种形式的能力。OOP 中最常见的多态性使用发生在使用父类引用来引用子类对象时。”

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

这一行基本上展示了Polymorphsim 概念,Parent 类引用可以包含Child 类对象。

【讨论】:

    【解决方案3】:

    当您将一个类的对象转换为该类实现的接口时,您只能访问该接口具有的已实现方法。

    【讨论】:

    • 但我仍然从中获取属性。
    • @Nepster 理解“Java 看到的类型”和“对象中实际存在的类型”之间的区别很重要。如果Int是一个接口,并且你有一个变量Int x;,那么Java就知道x拥有Int的所有方法,但是它对x一无所知,所以它可以'不允许您使用x.member 访问任何其他成员。但是x 是用一些具体的类创建的,它总是在那个类中。其他成员仍然存在,只要 Java 知道该对象具有该类...
    • @Nepster 所以如果你说Int x = something; Concrete y = (Concrete)x; 现在Java 知道对象是Concrete(如果不是,则会抛出异常),所以现在你可以访问之前的成员了总是在对象中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多