我正在尝试根据类型T获取接口实例。该类型可以是继承自BaseDictionary的Place或其他内容。
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>{}
And I get
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));
}
我尝试在这里和谷歌上寻找答案,但没有成功。我将非常感激任何帮助。
没有辅助方法可以解决问题,因为代码本质上是错误的。
提前感谢。
Place.class.isAssignableFrom(clazz)
可以帮助你避免上述情况。你可以使用@suppressWarnings
注解。 - Tala