首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未选中的强制转换:“java.lang.Class<capture<?>>”到“java.lang.Class<T>”

未选中的强制转换:“java.lang.Class<capture<?>>”到“java.lang.Class<T>”
EN

Stack Overflow用户
提问于 2019-04-29 21:43:07
回答 2查看 3K关注 0票数 0

我试图在我的超类中编写以下方法:

代码语言:javascript
复制
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告诉我

代码语言:javascript
复制
Unchecked cast: 'java.lang.Class<capture<?>>' to 'java.lang.Class<T>

要么我明白了第一行,或者,如果我改变了

代码语言:javascript
复制
Class<T> to Class<?>

那我就得直接表演

代码语言:javascript
复制
(T)mClass.getConstructors....

更准确地说,这个超类是抽象的,getDownloaderClassName()实际上定义如下:

代码语言:javascript
复制
public abstract String getDownloaderClassName();

这样,子类就可以使用下载器的后代选择使用getDownloader()检索。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-29 22:06:48

好吧,我想我在T和?之间搞混了,所以我找到了一种免费警告的方法:

代码语言:javascript
复制
   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();

然后,抽象的方法变成:

代码语言:javascript
复制
@Override
public Class<? extends Downloader> getDownloaderClassName() {
    return DemoDownloader.class;
}

在后人身上。

当我需要特定的字段或方法时,我想我将不得不转换getDownloader的结果。

票数 1
EN

Stack Overflow用户

发布于 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的一个实例。那是类型安全的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55911196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档