我试图在我的超类中编写以下方法:
public <T extends Downloader> T getDownloader(Context context, Integer... positions) throws Exception {
Class<T> mClass = (Class<T>)Class.forName(getDownloaderClassName());
T downloader = mClass.cast(mClass.getConstructors()[0].newInstance(context));
if (downloader != null)
downloader.setPositions(positions);
return downloader;
}然而,我不知道如何避免AndroidStudio告诉我
Unchecked cast: 'java.lang.Class<capture<?>>' to 'java.lang.Class<T>要么我明白了第一行,或者,如果我改变了
Class<T> to Class<?>那我就得直接表演
(T)mClass.getConstructors....更准确地说,这个超类是抽象的,getDownloaderClassName()实际上定义如下:
public abstract String getDownloaderClassName();这样,子类就可以使用下载器的后代选择使用getDownloader()检索。
发布于 2019-04-29 22:06:48
好吧,我想我在T和?之间搞混了,所以我找到了一种免费警告的方法:
public Downloader getDownloader(Context context, Integer... positions) throws Exception {
Class<? extends Downloader> mClass = getDownloaderClassName();
Downloader downloader = mClass.cast(mClass.getConstructors()[0].newInstance(context));
if (downloader != null)
downloader.setPositions(positions);
return downloader;
}
public abstract Class<? extends Downloader> getDownloaderClassName();然后,抽象的方法变成:
@Override
public Class<? extends Downloader> getDownloaderClassName() {
return DemoDownloader.class;
}在后人身上。
当我需要特定的字段或方法时,我想我将不得不转换getDownloader的结果。
发布于 2019-05-09 05:02:26
签名public <T extends Downloader> T getDownloader(Context context, Integer... positions)不是类型安全的。它使getDownloader成为一个通用方法,这意味着无论调用方希望T是什么,它都必须正确工作,而不知道T是什么。注意,T没有出现在任何参数类型中。这意味着具有相同精确参数的相同调用必须以某种方式返回类型Downloader1 (如果这是一个调用方所想要的),如果另一个调用方希望返回类型Downloader2,则必须返回类型Downloader2,而getDownloader方法没有任何有关调用方所需信息的信息!这显然是不可能的,除非getDownloader总是返回null。
签名public Downloader getDownloader(Context context, Integer... positions)是不同的,因为它说getDownloader方法返回Downloader类型。您的getDownloader方法选择要返回的对象的类型(只要它是Downloader的子类型);调用方不选择该类型,并且不能对返回的东西做任何假设,只可以假设它是Downloader的一个实例。那是类型安全的。
https://stackoverflow.com/questions/55911196
复制相似问题