Java Android泛型错误:该方法不适用于参数
我正在开发一个Android应用程序,其中一部分使用泛型。然而,我得到了一个编译器错误,我无法理解 我有以下体系结构:Java Android泛型错误:该方法不适用于参数,java,android,generics,Java,Android,Generics,我正在开发一个Android应用程序,其中一部分使用泛型。然而,我得到了一个编译器错误,我无法理解 我有以下体系结构: public interface IMakeableEncryptionBundle<T, F> { public void setConfigurationFactory(F configurationFactory); } public class VigEncryptionBundle implements IMakeableEncryptio
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 { }
“IMakeableEncryptionBundle类型中的方法setConfigurationFactory(capture#8-of?扩展IConfigurationFactory)不适用于参数(VigConfigurationFactory)”
但这不正是“扩展”应该做的吗?允许您就地使用子类/实现
此外,这两种方法都不起作用:
encryptionBundle.setConfigurationFactory((IConfigurationFactory) configFactory);
编辑: 我试图实现的是独立于特定的
IConfiguration
实现,并将encryptionBundle
的实例化放在外部类中
同时,我需要泛型来确保特定的IMakeableEncryptionBundle
实现可以使用它自己的IConfiguration
实现
此外,以下建议给了我另一个错误:
private IMakeableEncryptionBundle<
ITextContent,
IConfigurationFactory> encryptionBundle
= new VigEncryptionBundle();
private ImakableEncryptionBundle<
ITextContent,
IConfigurationFactory>encryptionBundle
=新的VigEncryptionBundle();
“类型不匹配:无法从VigEncryptionBundle转换为ImakableEncryptionBundle”
我甚至试图毫无变化地声明以下内容:
public interface IMakeableEncryptionBundle<T, F extends IConfigurationFactory>
公共接口ImakableEncryptionBundle
我可以通过更改
private IMakeableEncryptionBundle<ITextContent, ? extends IConfigurationFactory> encryptionBundle = new VigEncryptionBundle();
private IMakeableEncryptionBundle encryptionBundle=new VigEncryptionBundle();
到
private IMakeableEncryptionBundle encryptionBundle=new VigEncryptionBundle();
我不太确定它背后的原因,但我认为这与IConfigurationFactory是一个接口这一事实有关。我可以通过更改
private IMakeableEncryptionBundle<ITextContent, ? extends IConfigurationFactory> encryptionBundle = new VigEncryptionBundle();
private IMakeableEncryptionBundle encryptionBundle=new VigEncryptionBundle();
到
private IMakeableEncryptionBundle encryptionBundle=new VigEncryptionBundle();
我不太确定它背后的原因,但我认为这与IConfigurationFactory是一个接口这一事实有关。类型
?在encryptionBundle
中扩展IConfigurationFactory
意味着“您不知道扩展了IConfigurationFactory
的某种类型”。(变量encryptionBundle
被分配给一个可以提供更精确类型的值这一事实是不相关的;类型检查器在检查分配是否有效后立即将其忘记。)
因此,当您尝试在VigConfigurationFactory
上调用setConfigurationFactory
时,类型检查器正确地拒绝了它:您只知道显示在setConfigurationFactory
的参数类型中的F
是扩展IConfigurationFactory
的某个类,而不是VigConfigur>尤其是A工厂
如何解决这一问题取决于您为什么首先要使用该类型声明
encryptionFactory
。如果可行,只需更改?即可将IConfigurationFactory
扩展到VigConfigurationFactory
。否则,如何解决问题将取决于您的目标。类型>?在encryptionBundle
中扩展IConfigurationFactory
意味着“您不知道扩展了IConfigurationFactory
的某种类型”。(变量encryptionBundle
被分配给一个可以提供更精确类型的值这一事实是不相关的;类型检查器在检查分配是否有效后立即将其忘记。)
因此,当您尝试在VigConfigurationFactory
上调用setConfigurationFactory
时,类型检查器正确地拒绝了它:您只知道显示在setConfigurationFactory
的参数类型中的F
是扩展IConfigurationFactory
的某个类,而不是VigConfigur>尤其是A工厂
如何解决这一问题取决于您为什么首先要使用该类型声明
encryptionFactory
。如果可行,只需更改?即可将IConfigurationFactory
扩展到VigConfigurationFactory
。否则,如何解决问题将取决于您的目标。因此,从我的理解来看derstand,“extends”只适用于这一行(声明),确保使用的实例是正确的类型。但是如何修改代码以实现我所需要的?(参见编辑)我不能使用您建议的方法,因为这会导致依赖于VigConfigurationFactory
。我几乎尝试了所有方法,但我不知道如何利用泛型以这种方式工作。因此,据我所知,“扩展”仅适用于这一行(声明),确保使用的实例是正确的类型。但如何修改代码以实现所需?(请参阅编辑)我不能使用您建议的方法,因为这会导致依赖于VigConfigurationFactory
。我已经尝试了几乎所有的方法,但我不知道如何利用泛型以这种方式工作。这对我不起作用。我遇到了一个类型错误(请参见编辑).您是否修改了VigEncryptionBundle
类?我想在上面添加此注释,但我没有代表:(与@jacobm的注释内联,通过将接口声明更改为,似乎您总是希望F泛型类型为IConfigurationFactory。您可以在此处执行以下两项操作之一来处理您尝试执行的操作:删除F泛型参数并让setConfigurationFactory接受IConfigurationFactory的参数,或者您可以更改VigEncryptionBundle的声明以实现IMAKEableEncryptionBundle
private IMakeableEncryptionBundle<ITextContent, ? extends IConfigurationFactory> encryptionBundle = new VigEncryptionBundle();
private IMakeableEncryptionBundle<ITextContent, IConfigurationFactory> encryptionBundle = new VigEncryptionBundle();