2 回答

TA贡献1794条经验 获得超7个赞
好的,我想我在 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 的结果。

TA贡献1817条经验 获得超6个赞
签名public <T extends Downloader> T getDownloader(Context context, Integer... positions)
不是类型安全的。它创建getDownloader
了一个通用方法,这意味着无论调用者想要什么,它都必须正常工作T
,而不知道是T
什么。请注意,T
不会出现在任何参数类型中。这意味着具有相同确切参数的相同确切调用必须以某种方式返回类型Downloader1
,如果这是一个调用者想要的,并且Downloader2
如果这是另一个调用者想要的,则还必须返回类型,而该getDownloader
方法没有关于调用者想要什么的任何信息!这显然是不可能的,除非getDownloader
总是返回null
。
签名public Downloader getDownloader(Context context, Integer... positions)
不同,因为它表示该getDownloader
方法返回 type Downloader
。您的getDownloader
方法选择要返回的事物的类型(只要它是 的子类型Downloader
);调用者不选择类型,并且不能对返回的事物做出任何假设,除非它是Downloader
. 那是类型安全的。
添加回答
举报