Java类内部通用绑定模糊了父接口通用绑定定义

时间:2018-04-21 18:07:19

标签: java generics polymorphism generic-programming

我有以下类结构,我对ProxyFactory类的定义有编译错误:

错误:(32,47)java:type参数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> {
    }
}

1 个答案:

答案 0 :(得分:4)

停止使用原始类型!

似乎使用原始类型的行为会产生此编译器错误。 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>> {