java - Android 泛型错误 : The method is not applicable for the arguments

标签 java android generics

我正在开发一个 Android 应用程序,并且我正在使用泛型作为其中的一部分。但是我遇到了一个我无法理解的编译器错误。

我有以下架构:

public interface IMakeableEncryptionBundle<T, F> {
  public void setConfigurationFactory(F configurationFactory);
}

public class VigEncryptionBundle 
    implements IMakeableEncryptionBundle<ITextContent, VigConfigurationFactory> {
  @Override
  public void setConfigurationFactory(VigConfigurationFactory configFactory) {
    // Set the factory.
  }
}


public interface IConfigurationFactory { }

public final class VigConfigurationFactory implements IConfigurationFactory { }

我这样使用它:

private IMakeableEncryptionBundle<
    ITextContent,
    ? extends IConfigurationFactory> encryptionBundle
  = new VigEncryptionBundle();

这就是导致错误的原因:

VigConfigurationFactory configFactory = (VigConfigurationFactory) configObj;
encryptionBundle.setConfigurationFactory(configFactory);

“IMakeableEncryptionBundle 类型中的方法 setConfigurationFactory(capture#8-of ? extends IConfigurationFactory) 不适用于参数 (VigConfigurationFactory)”

但这不正是“扩展”应该做的事情吗?允许您就地使用子类/实现?

这也不起作用:

encryptionBundle.setConfigurationFactory((IConfigurationFactory) configFactory);



编辑: 我想要实现的目标是独立于特定的 IConfiguration 实现,并将 encryptionBundle 的实例化放在外部类中。

同时,我需要泛型来确保特定的 IMakeableEncryptionBundle 实现可以使用它自己的 IConfiguration 实现。

此外,下面建议的以下内容给了我另一个错误:

private IMakeableEncryptionBundle<
    ITextContent,
    IConfigurationFactory> encryptionBundle
  = new VigEncryptionBundle();

“类型不匹配:无法从 VigEncryptionBundle 转换为 IMakeableEncryptionBundle”


我什至尝试声明以下内容而不做任何更改:

public interface IMakeableEncryptionBundle<T, F extends IConfigurationFactory>

最佳答案

类型? extends IConfigurationFactoryencryptionBundle意味着“你不知道的某种类型扩展了 IConfigurationFactory 。(变量 encryptionBundle 被分配给一个可以赋予更精确类型的值这一事实是无关紧要的;类型检查器在检查后立即忘记了它分配有效。)

所以当您尝试调用setConfigurationFactory时在VigConfigurationFactory上,类型检查器正确地拒绝它:您只知道 F出现在setConfigurationFactory中的参数类型是扩展IConfigurationFactorysome类,而不是 VigConfigurationFactory特别是。

如何解决此问题取决于您想要声明 encryptionFactory 的原因首先是那种类型。如果可行的话,只需更改 ? extends IConfigurationFactoryVigConfigurationFactory将工作。否则,如何解决问题将取决于您的目标。

关于java - Android 泛型错误 : The method is not applicable for the arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082313/

相关文章:

java - 如何开始遍历集合而不是从头开始

java - Recyclerview 项目中的阴影效果

java - 裁剪后如何从图库中选择图像并保存在应用程序中?

android - 无法将我的 apk 上传到 Play 商店

安卓没有设置默认值

java - 如何在android中使用位置获取模态类数据

android - "@+android:id/title"是什么意思?

javap 和泛型的类型删除

java - 我使用泛型,但不是 This Class<T> 东西!

c# - 如何将对象列表转换为 csv?