我具有以下类结构,其中ProxyFactory
类的定义存在编译器错误:
错误:(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>> {