Java 不兼容的类型:推断的类型不符合上限

Java 不兼容的类型:推断的类型不符合上限,java,generics,java-8,typechecking,Java,Generics,Java 8,Typechecking,当我看到以下错误时,我正在实现一些体系结构: 错误:(33,55)java:不兼容的类型:推断的类型不符合上限 推断:java.io.Serializable 上限:sandbox.ExpirePolicy,java.io.Serializable 整个简化代码如下: 接口配置{} 接口过期策略{} 接口工厂{} 类FactoryBuilder{ 公共静态工厂(T实例){ System.out.println(instance.getClass()); 返回新工厂(){}; } } 类Base

当我看到以下错误时,我正在实现一些体系结构:

错误:(33,55)java:不兼容的类型:推断的类型不符合上限
推断:java.io.Serializable
上限:sandbox.ExpirePolicy,java.io.Serializable
整个简化代码如下:

接口配置{}
接口过期策略{}
接口工厂{}
类FactoryBuilder{
公共静态工厂(T实例){
System.out.println(instance.getClass());
返回新工厂(){};
}
}
类BaseConfiguration实现配置{

public BaseConfiguration setExpiryPolicyFactory(Factory工厂生成器似乎应该采用
ExpirePolicy
而不是
Serializable
来创建工厂。将签名更改为

class FactoryBuilder {
    public static <T extends ExpirePolicy> Factory<T> of(T instance){
        System.out.println(instance.getClass());
        return new Factory<T>() {};
    }
}
类FactoryBuilder{
公共静态工厂(T实例){
System.out.println(instance.getClass());
返回新工厂(){};
}
}
允许使用

class C<K,V> extends BaseConfiguration<K,V> {

      public C<K,V> setExpiration(){
          super.setExpiryPolicyFactory(FactoryBuilder.of(getExpirePolicy()));
          return this;
      }

      private ExpirePolicy getExpirePolicy(){
          return new ExpirePolicy() {};
      }
}
C类扩展了基本配置{
公共C setExpiration(){
super.setExpiryPolicyFactory(FactoryBuilder.of(getExpirePolicy());
归还这个;
}
私有ExpirePolicy getExpirePolicy(){
返回新的ExpirePolicy(){};
}
}
没有额外的演员阵容

C
的第二个实现会编译,但会出现警告,因为它使用的是原始类型。

当您从
extensed Base
语句中删除
时,
Base
类开始被视为原始类型

根据:

类的超类型可以是原始类型。成员访问 类被视为正常,并且超类型的成员访问被忽略 视为原始类型。在类的构造函数中,调用 super被视为对原始类型的方法调用

这意味着
super.test(…)
调用也被视为对原始类型的方法调用,就像它被声明为:

public void test(ArrayList list) {}

因此不会发生编译错误。

问题不在于factory builder应该采取什么措施(很明显)问题是为什么C编译的第二个实现不依赖于工厂的泛型。另外,我可以说,您可以通过将
扩展可序列化的
添加到它编译的
过期策略
来解决问题(带有警告)因为第二个版本会忽略任何泛型类型声明,而是使用原始类型。为什么您希望它不会编译?我希望它不会编译,因为BaseConfiguration类中的类型参数不会影响setExpiryPolicyFactory方法的'factory'参数的类型,所以即使在C的第二个实现中必须仍然存在编译时错误。并且我们仍然无法调用setExpiryPolicyFactory(Factory