0

我正在开发一个 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>
4

2 回答 2

2

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

因此,当您尝试调用setConfigurationFactoryaVigConfigurationFactory时,类型检查器理所当然地拒绝了它:您只知道在的参数类型F中显示的 the 是某个扩展的类,而不是特别的。setConfigurationFactoryIConfigurationFactoryVigConfigurationFactory

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

于 2013-08-06T15:02:21.043 回答
1

我能够通过更改使您的代码正常工作

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

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

我不太确定它背后的原因,但我认为这与 IConfigurationFactory 是一个接口这一事实有关。

于 2013-08-06T14:40:56.010 回答