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