2017-01-02 4 views
0

私は基底がclass BaseNewsItemであり、2つの派生クラスNewsItemMovieNewsItemがあります。次に、MovieNewsItemのリストを保持していて、パーセル可能なMovieListingFeedクラスがあります。これは、任意のアクティビティが必要とするときにこのリストをパーセルすることができます。ジェネリックで固まった

protected MovieNewsListingFeed(Parcel in) { 
    this.pg = in.readParcelable(PageDetail.class.getClassLoader()); 
    this.items=new ArrayList<>(); 
    in.readTypedList(items, MovieNewsItem.CREATOR); 
} 

私は行でエラーが表示されます。

in.readTypedList(items, MovieNewsItem.CREATOR); 

エラー:

Error:(60, 11) error: method readTypedList in class Parcel cannot be applied to given types; required: List<T>,Creator<T> found: ArrayList<CAP#1>,Creator<CAP#2> reason: inferred type does not conform to equality constraint(s) inferred: CAP#2 equality constraints(s): CAP#2,CAP#1 where T is a type-variable: T extends Object declared in method <T>readTypedList(List<T>,Creator<T>) where CAP#1,CAP#2 are fresh type-variables: CAP#1 extends BaseNewsItem from capture of ? extends BaseNewsItem CAP#2 extends BaseNewsItem from capture of ? extends BaseNewsItem 

私はジェネリックでは初心者ですので、私は上記のエラーを探したときに、私はdidnの解決策を完全に公開することはできません。私はArrayList<MovieNewsItem>ArrayList<BaseNewsItem>に変換する必要があるため、追加しました。 MovieNewsItemクラスから

関連するコード:

public static final Creator<? extends BaseNewsItem> CREATOR = new Creator<MovieNewsItem>() { 
    public MovieNewsItem createFromParcel(Parcel source) { 
     return new MovieNewsItem(source); 
    } 

    public MovieNewsItem[] newArray(int size) { 
     return new MovieNewsItem[size]; 
    } 
}; 

任意のさらなるコードスニペットが必要な場合、私に教えてください。

UPDATE 1:(AndroidのフレームワークからreadTypedList。)

public final <T> void readTypedList(List<T> list, Parcelable.Creator<T> c) { 
    int M = list.size(); 
    int N = readInt(); 
    int i = 0; 
    for (; i < M && i < N; i++) { 
     if (readInt() != 0) { 
      list.set(i, c.createFromParcel(this)); 
     } else { 
      list.set(i, null); 
     } 
    } 
    for (; i<N; i++) { 
     if (readInt() != 0) { 
      list.add(c.createFromParcel(this)); 
     } else { 
      list.add(null); 
     } 
    } 
    for (; i<M; i++) { 
     list.remove(N); 
    } 
} 

MovieNewsListingFeed.java(問題のファイル):

public class MovieNewsListingFeed implements Parcelable { 

PageDetail pg; 

public void setItems(ArrayList<? extends BaseNewsItem> items) { 
    this.items = items; 
} 

ArrayList<? extends BaseNewsItem> items; 

public ArrayList<? extends BaseNewsItem> getItemsTemp() { 
    return itemsTemp; 
} 

public void setItemsTemp(ArrayList<? extends BaseNewsItem> itemsTemp) { 
    this.itemsTemp = itemsTemp; 
} 

ArrayList<? extends BaseNewsItem> itemsTemp; 

public ArrayList<? extends BaseNewsItem> getItems() { 
    return items; 
} 

public PageDetail getPg() { 
    return pg; 
} 


@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeParcelable(this.pg, flags); 
    dest.writeTypedList(items); 
} 

public MovieNewsListingFeed() { 
} 

protected MovieNewsListingFeed(Parcel in) { 
    this.pg = in.readParcelable(PageDetail.class.getClassLoader()); 
    this.items = new ArrayList<>(); 
    in.readTypedList(items, MovieNewsItem.CREATOR); 
} 

public static final Parcelable.Creator<MovieNewsListingFeed> CREATOR = new Parcelable.Creator<MovieNewsListingFeed>() { 
    public MovieNewsListingFeed createFromParcel(Parcel source) { 
     return new MovieNewsListingFeed(source); 
    } 

    public MovieNewsListingFeed[] newArray(int size) { 
     return new MovieNewsListingFeed[size]; 
    } 
}; 

}

MovieNewsItem.java:

public class MovieNewsItem extends BaseNewsItem implements Parcelable { 
String hl; 
String imageid; 
String syn; 
String id; 
String dm; 
String tn; 
String dl = ""; 
String sectionHeader; 
String upd; 
String ud; 

private int validListPosition = -1; 

public int getValidListPosition() { 
    return validListPosition; 
} 

@Override 
public void setTitle(String title) { 

} 

@Override 
public void setId(String id) { 

} 

@Override 
public void setDate(String date) { 

} 

@Override 
public void setNewsType(int newsType) { 

} 

public String getFormatedDate() { 
    return formatedDate; 
} 

String formatedDate; 

int position; 
int newSectionType = NewsType.CONTENT_TYPE_NEWS; 
String dayHeading; 

public int getPosition() { 
    return position; 
} 

public void setPosition(int position) { 
    this.position = position; 
} 


public void setNewSectionType(int newSectionType) { 
    this.newSectionType = newSectionType; 
} 

public String getDayHeading() { 
    return dayHeading; 
} 

public void setDayHeading(String dayHeading) { 
    this.dayHeading = dayHeading; 
} 

@Override 
public void setValidListPosition(int listPosition) { 

} 

public String getWu() { 
    return wu; 
} 

String wu; 


public String getHl() { 
    return hl; 
} 

public String getImageid() { 
    return imageid; 
} 

public String getSyn() { 
    return syn; 
} 

public String getId() { 
    return id; 
} 

public String getDm() { 
    return dm; 
} 

public String getTn() { 
    return tn; 
} 

public String getDl() { 
    return dl; 
} 

public String getSectionHeader() { 
    return sectionHeader; 
} 


public MovieNewsItem() { 
} 

@Override 
public String getTitle() { 
    return (!TextUtils.isEmpty(getSyn())) ? getSyn() : getHl(); 
} 

@Override 
public String getDate() { 
    return getFormatedDate(); 
} 

@Override 
public int getNewsType() { 
    return newSectionType; 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeString(this.hl); 
    dest.writeString(this.imageid); 
    dest.writeString(this.syn); 
    dest.writeString(this.id); 
    dest.writeString(this.dm); 
    dest.writeString(this.tn); 
    dest.writeString(this.dl); 
    dest.writeString(this.sectionHeader); 
    dest.writeString(this.upd); 
    dest.writeString(this.ud); 
    dest.writeInt(this.position); 
    dest.writeInt(this.newSectionType); 
    dest.writeString(this.dayHeading); 
    dest.writeString(this.wu); 
} 

protected MovieNewsItem(Parcel in) { 
    this.hl = in.readString(); 
    this.imageid = in.readString(); 
    this.syn = in.readString(); 
    this.id = in.readString(); 
    this.dm = in.readString(); 
    this.tn = in.readString(); 
    this.dl = in.readString(); 
    this.sectionHeader = in.readString(); 
    this.upd = in.readString(); 
    this.ud = in.readString(); 
    this.position = in.readInt(); 
    this.newSectionType = in.readInt(); 
    this.dayHeading = in.readString(); 
    this.wu = in.readString(); 
} 

public static final Creator<? extends BaseNewsItem> CREATOR = new Creator<MovieNewsItem>() { 
    public MovieNewsItem createFromParcel(Parcel source) { 
     return new MovieNewsItem(source); 
    } 

    public MovieNewsItem[] newArray(int size) { 
     return new MovieNewsItem[size]; 
    } 
}; 

@Override 
public boolean equals(Object obj) { 
    MovieNewsItem newsItem = this; 
    if (obj instanceof MovieNewsItem) { 
     MovieNewsItem oldNewsItem = (MovieNewsItem) obj; 
     if (oldNewsItem != null && 
       newsItem.id.equals(oldNewsItem.id)) { 
      return true; 
     } 
    } 
    return false; 
} 

}

BaseNewsItem.java:

public abstract class BaseNewsItem implements NewsItemType { 

} 

NewsItemType.java:あなたの問題は、この最小限の例を再現することができ

public interface NewsItemType extends Parcelable { 
String getTitle(); 
String getId(); 
String getDate(); 
int getNewsType(); 
String getDayHeading(); 
int getValidListPosition(); 
int getPosition(); 

void setTitle(String title); 
void setId(String id); 
void setDate(String date); 
void setNewsType(int newsType); 
void setDayHeading(String dayHeading); 
void setValidListPosition(int listPosition); 
void setPosition(int position); 

}

+0

**すべて**関連コードを追加してください。例えば ​​'readTypedList()'などです。 – GhostCat

+1

'items 'の宣言は何ですか?あなたは何かをメソッドに渡していますが、コンパイラは何かがしていないことを文句を言います。私たちはあなたにすべての詳細を尋ねなければなりません.... – GhostCat

+1

あなたは[mcve]を投稿する必要があります - たとえば、 'items'のタイプはあなたの質問に非常に関連していますが、あなたはそれを表示していません... – assylias

答えて

1

? extends BaseNewsItem及び第二のリストで? extends Objectを置き換えますParcelable.Creatorであり、ロジックはまったく同じです)

public void test() { 
    List<? extends Object> a1 = new ArrayList<>(); 
    List<? extends Object> a2 = new ArrayList<>(); 
    m(a1, a2); //your compilation error here 
} 
public <T> void m(List<T> a1, List<T> a2) { } 

問題は二つのリストのジェネリック型が無関係であるということです:彼らは両方とも同じ基本クラスを拡張するが、それは我々がそれらについて知っているすべてです - たとえばa1ためList<String>a2List<Integer>かもしれません。

しかし、mメソッドでは、2つのジェネリック型が同じであると予想されます。これは、渡すものではありません。

ですから、たとえば、同じジェネリック型を持つリストを渡す必要があります:

public void test() { 
    List<SomeBaseClass> a1 = new ArrayList<>(); 
    List<SomeBaseClass> a2 = new ArrayList<>(); 
    m(a1, a2); //compiles fine 
} 
public <T> void m(List<T> a1, List<T> a2) { } 
0

これは

List<? extends BaseNewsItem> itemsTemp; 
に不整合 変更に

ArrayList<? extends BaseNewsItem> itemsTemp; 

を入力する予定です

メソッドを次のように変更します。

public final <T> void readTypedList(List<? extends BaseNewsItem> list, Parcelable.Creator<? extends BaseNewsItem> c) { 

}

それが動作します願っています。

関連する問題