Java 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

我正在开发一个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 { }
“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();