我正在开发一个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?扩展了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 IConfigurationFactory中的encryptionBundle类型表示“某些您不知道扩展为IConfigurationFactory的类型。(将变量encryptionBundle分配给可以指定为更精确类型的值这一事实是不相关的;类型检查器会在检查分配有效之后立即将其忘记。)

因此,当您尝试在setConfigurationFactory上调用VigConfigurationFactory时,类型检查器会正确拒绝它:您只知道显示在F参数类型中的setConfigurationFactory是扩展了IConfigurationFactory的某个类,并不是特别是VigConfigurationFactory

如何解决此问题取决于您为什么要首先声明该类型的encryptionFactory。如果可行,只需将? extends IConfigurationFactory更改为VigConfigurationFactory即可。否则,如何解决问题将取决于您所追求的目标。

10-06 15:08
查看更多