我正在开发一个 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 IConfigurationFactory
在encryptionBundle
意味着“你不知道的某种类型扩展了 IConfigurationFactory
。(变量 encryptionBundle
被分配给一个可以赋予更精确类型的值这一事实是无关紧要的;类型检查器在检查后立即忘记了它分配有效。)
所以当您尝试调用setConfigurationFactory
时在VigConfigurationFactory
上,类型检查器正确地拒绝它:您只知道 F
出现在setConfigurationFactory
中的参数类型是扩展IConfigurationFactory
的some类,而不是 VigConfigurationFactory
特别是。
如何解决此问题取决于您想要声明 encryptionFactory
的原因首先是那种类型。如果可行的话,只需更改 ? extends IConfigurationFactory
至VigConfigurationFactory
将工作。否则,如何解决问题将取决于您的目标。
关于java - Android 泛型错误 : The method is not applicable for the arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18082313/