4

T の型に応じてインターフェイス インスタンスを取得しようとしています。BaseDictionary を拡張する場所または何か。

public static <T extends BaseDictionary> IDictionaryDataSource<T> getEntityDataSourceInstance(Class<T> clazz,
        Context cxt) {
    if (Place.class.isAssignableFrom(clazz)) return (IDictionaryDataSource<T>) new PlaceDataSource(cxt);
            //here some other types, same lines

    return null;
}

public abstract class BaseDictionary{}

public class Place extends BaseDictionary{}

public interface IDictionaryDataSource<T extends BaseDictionary>{}

public abstract class BaseDictionaryDataSource<T extends BaseDictionary> implements   IDictionaryDataSource<T>{}

public class PlaceDataSource extends BaseDictionaryDataSource<Place>{}

そして、私は得る

Type mismatch: cannot convert from PlaceDataSource to IDictionaryDataSource<T>

また

Type safety: Unchecked cast from PlaceDataSource to IDictionaryDataSource<T>

上記のようにキャストした場合。

コンパイルエラーと警告が発生する理由を説明できますか?

ここで呼び出されます

public static <T extends BaseDictionary> DictionaryElementPickerFragment<T> newInstance(Class<T> clazz, Context cxt){
     //somecode here
     fragment.setDataSource(DictUtils.getEntityDataSourceInstance(clazz, cxt));
}

こことグーグルで答えを見つけようとしましたが、成功しませんでした。助けていただければ幸いです。今、私はこう思う

コードが根本的に間違っているため、問題を回避するためのヘルパー メソッドはありません。

前もって感謝します。

4

4 に答える 4

1

このより具体的な例は、型パラメーターの分散の 1 つである問題を示しています。

void foo(List<String> stringList, Integer anInteger) {
  List<Object> objList = (List<Object>) stringList;
  objList.add(anInteger);  // Violation -- adding an object to a list of strings
                           // could cause someone getting a "String" to get an
                           // Integer stead
}

だから aは a ですが、 aList<String>ではありません。List<Object>List<? extends Object>


特定のインスタンスでは、キャストできません

PlaceDataSourceIDictionaryDataSource<T>

PlaceDataSource は ですが、 IDictionaryDataSource<Place>私たちが知っている唯一のことは、 のスーパークラスを<T>拡張するということです。BaseDictionaryBaseDictionary

だからあなたはにキャストすることができPlaceDataSourceます

  1. IDictionaryDataSource<Place>またはに
  2. IDictionaryDataSource<? super Place>またはに
  3. IDictionaryDataSource<? extends BaseDictionary>

なぜなら、そうであるIDictionaryDataSource<T>ことTが保証されていないからです。そうすると、実際の型パラメーターと正式な型パラメーターPlaceが一致しなくなります。PlaceT

于 2013-08-09T20:27:41.730 に答える
0

静的メソッドではなく、クラスgetEntityDataSourceInstanceのインスタンス メソッドであるように見えます。BaseDictionary

サブクラスはDictionaryDataSource、作成するタイプを認識します。

于 2013-08-09T20:13:27.120 に答える