Java class 内部泛型绑定掩盖了父接口泛型绑定定义
Java class inner generic bound obscures parent interface generic bound definition
我有以下 class 结构,其中 ProxyFactory
class 的定义出现编译器错误:
错误:(32, 47) java:类型参数 com.company.Factory.ProxyUpdatable 不在类型变量 T
的范围内
当我替换 ProxyUpdatable
的定义以简单地保存一个对象并删除它的类型参数时,代码编译正常。
为什么 ProxyUpdatable
的类型参数会影响其工厂实现 ProxyFactory
的边界?据我所知,将通用边界添加到 ProxyUpdatable
不会改变它实现的接口 Updatable<ProxyUpdatable>
package com.company;
public abstract class Factory<T extends Factory.Updatable<T>> {
public interface Updatable<T> {
void copyFrom(T updated);
}
static class ConcreteUpdatable implements Updatable<ConcreteUpdatable> {
@Override
public void copyFrom(ConcreteUpdatable updated) {/* copyFrom implementation */}
}
static class ProxyUpdatable<T extends Updatable<T>> implements Updatable<ProxyUpdatable> {
private final T implementation;
ProxyUpdatable(T implementation) {
this.implementation = implementation;
}
@Override
public void copyFrom(ProxyUpdatable updated) {/* copyFrom implementation */}
}
static class ConcreteFactory extends Factory<ConcreteUpdatable> {
}
static class ProxyFactory extends Factory<ProxyUpdatable> {
}
}
停止使用原始类型!
似乎使用原始类型的行为导致了这个编译器错误。 ProxyUpdatable
是泛型,要用的时候加上泛型参数。
要解决此问题,请将 ProxyUpdatable
的声明更改为:
static class ProxyUpdatable<T extends Updatable<T>> implements Updatable<ProxyUpdatable<T>> {
请注意,它现在实现了 Updatable<ProxyUpdatable<T>>
然后您还必须更改 ProxyFactory
的声明。您也可以使其扩展 Factory<ProxyUpdatable<ConcreteUpdatable>>
或使 ProxyFactory
通用:
static class ProxyFactory<T extends Updatable<T>> extends Factory<ProxyUpdatable<T>> {
我有以下 class 结构,其中 ProxyFactory
class 的定义出现编译器错误:
错误:(32, 47) java:类型参数 com.company.Factory.ProxyUpdatable 不在类型变量 T
的范围内当我替换 ProxyUpdatable
的定义以简单地保存一个对象并删除它的类型参数时,代码编译正常。
为什么 ProxyUpdatable
的类型参数会影响其工厂实现 ProxyFactory
的边界?据我所知,将通用边界添加到 ProxyUpdatable
不会改变它实现的接口 Updatable<ProxyUpdatable>
package com.company;
public abstract class Factory<T extends Factory.Updatable<T>> {
public interface Updatable<T> {
void copyFrom(T updated);
}
static class ConcreteUpdatable implements Updatable<ConcreteUpdatable> {
@Override
public void copyFrom(ConcreteUpdatable updated) {/* copyFrom implementation */}
}
static class ProxyUpdatable<T extends Updatable<T>> implements Updatable<ProxyUpdatable> {
private final T implementation;
ProxyUpdatable(T implementation) {
this.implementation = implementation;
}
@Override
public void copyFrom(ProxyUpdatable updated) {/* copyFrom implementation */}
}
static class ConcreteFactory extends Factory<ConcreteUpdatable> {
}
static class ProxyFactory extends Factory<ProxyUpdatable> {
}
}
停止使用原始类型!
似乎使用原始类型的行为导致了这个编译器错误。 ProxyUpdatable
是泛型,要用的时候加上泛型参数。
要解决此问题,请将 ProxyUpdatable
的声明更改为:
static class ProxyUpdatable<T extends Updatable<T>> implements Updatable<ProxyUpdatable<T>> {
请注意,它现在实现了 Updatable<ProxyUpdatable<T>>
然后您还必须更改 ProxyFactory
的声明。您也可以使其扩展 Factory<ProxyUpdatable<ConcreteUpdatable>>
或使 ProxyFactory
通用:
static class ProxyFactory<T extends Updatable<T>> extends Factory<ProxyUpdatable<T>> {