Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用超类实例数据初始化子类实例_Java_Android - Fatal编程技术网

Java使用超类实例数据初始化子类实例

Java使用超类实例数据初始化子类实例,java,android,Java,Android,我有一个类FavoriteInfo,它存储用户的收藏夹。它有一组私有字段和公共获取: public class FavoriteInfo implements Serializable { public static String KEY ="FavoriteInfo"; private String favtype; private String rdbkey; private String VideoURL; private St

我有一个类
FavoriteInfo
,它存储用户的收藏夹。它有一组私有字段和公共获取:

public class FavoriteInfo implements Serializable {         
    public static String KEY ="FavoriteInfo";

    private String favtype;
    private String rdbkey;

    private String VideoURL;
    private String ImageURL;
    private Float Temperature;
    /* more such fields */

    public String getFavtype() {
        return favtype;
    }

    public void setFavtype(String favtype) {
        this.favtype = favtype;
    }

    public String getRdbkey() {
        return rdbkey;
    }

    public void setRdbkey(String rdbkey) {
        this.rdbkey = rdbkey;
    }

    public String getImageURL() {
        return ImageURL;
    }

    public void setImageURL(String imageURL) {
        this.ImageURL = imageURL;
    }
那么我有:

public abstract class MomentData extends FavoriteInfo {
    public static final int DATA_TYPE_IMAGE = 0;
    public static final int DATA_TYPE_VIDEO = 1;

    public abstract int getDataType();
    public abstract View getChildView(Context context,View convertView, ViewGroup parent);
}
以及两个扩展MomentData的公共类
MomentImageData
MomentVideoData

我的数据来自一个HTML请求,该请求直接填充
FavoriteInfo
中的字段,并返回
FavoriteInfo
实例的列表。这是我想保持不变并利用的数据源。除了子类中的
DATA\u TYPE\u IMAGE
DATA\u TYPE\u VIDEO
之外,我没有任何其他字段

我的问题是如何使用此列表来构建
MomentImageData
列表和
MomentVideoData
列表

这就是我想要实现的目标:

List<MomentData> mData;
List<MomentImageData> imgData; // from one source 
List<MomentVideoData> videoData; // from another

mdata.addAll(imgData);
mdata.addAll(videoData);
列出mData;
列出imgData;//从一个来源
列出视频数据;//从另一个
mdata.addAll(imgData);
mdata.addAll(视频数据);

这可能看起来很奇怪,但它实际上是一个Android应用程序,我有一个自定义适配器,它将
MomentData mData
作为数据源,然后根据类型(图像或视频)动态放大不同的视图

从超类实例创建子类实例最直接的方法是将字段从超类实例复制到子类实例中

public MomentImageData(FavoriteInfo info) {
    setRdbkey(info.getRdbkey());
    // ... and all the others
}
另一种方法是使用反射或深度复制库来避免编写所有这些setter

Java不会这样做,因为MomentImageData是FavoriteInfo,但不是 维切维萨

另一种方法是使用组合而不是继承:

public class MomentImageData {
     FavoriteInfo info;

     public MomentImageData(FavoriteInfo info) {
          this.info = info;
     }
}
因此,您可以轻松创建一个实例,如

List<FavoriteInfo> list = new ArrayList();
// fill the list
MomentImageData mid = new MomentImageData(list.get(1));
List List=new ArrayList();
//填写清单
MomentImageData mid=新的MomentImageData(list.get(1));

不太清楚您想要完成什么。不管怎样,当你有一个额外的类(类型)
MomentImageData
时,为什么你需要
DATA\u TYPE\u IMAGE
?@petermm更新了问题。我假设在
FavoriteInfo
中,你收到的是
VideoURL
ImageURL
。这是真的吗?更改您的类型声明:
List实际上我有一个列表。我想分别填充MomentImageData和MomentVideoData,并将它们添加到我的列表中。这就是为什么我有这个继承结构。你可以看到我更新的描述。非常感谢。即使FavoriteInfo类中的字段都是私有的,您仍然可以在子类中设置它们并在子类中获取它们吗?谢谢。因为我认为私有字段不会被子类继承。你的问题和上面的评论都不清楚。您是否收到
列表
列表
?那么列表中元素的实际类型是什么?您可以有一个
列表
,列表中的每个对象都是
MomentImageData
MomentVideoData
的实例,或者只是
FavoriteInfo
的普通实例。所有这些都会对如何解决你的问题产生影响。@AbbéRésina我收到一份清单。实际类型是类型FavoriteInfo。