【发布时间】:2018-04-22 02:24:28
【问题描述】:
我有以下类结构,其中ProxyFactoryclass 的定义出现编译器错误:
错误:(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> {
}
}
【问题讨论】:
-
我认为
ProxyUpdateable中的T与Factory必须采用的类型之间没有关系。虽然没有测试过。尝试更改类型变量名称,然后仔细查看源代码,可能会弹出一些内容。 -
将
ProxyUpdatable<T extends Updatable<T>>转换为ProxyUpdatable<P extends Updatable<P>>不能修复编译器错误。所以不知道为什么你认为它掩盖了一些东西。 -
@markspace 的关系是 ProxyFactory 将需要更新 Updatable
的任何可能实现。它通过在 Updatable.getClass() 上匹配,在内部委派一个更具体的 Factory T 实现来做到这一点。
标签: java generics polymorphism generic-programming