为了账号安全,请及时绑定邮箱和手机立即绑定

未经检查的强制转换:'java.lang.Class<capture<?>>'

未经检查的强制转换:'java.lang.Class<capture<?>>'

HUX布斯 2022-10-26 17:14:54
我正在尝试在我的超类中编写以下方法: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() 检索的 Downloader 的后代。
查看完整描述

2 回答

?
慕田峪9158850

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 的结果。


查看完整回答
反对 回复 2022-10-26
?
慕的地6264312

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. 那是类型安全的。


查看完整回答
反对 回复 2022-10-26
  • 2 回答
  • 0 关注
  • 413 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信