Java类内部泛型绑定模糊父接口泛型绑定定义

Java类内部泛型绑定模糊父接口泛型绑定定义,java,generics,polymorphism,generic-programming,Java,Generics,Polymorphism,Generic Programming,我有以下类结构,其中ProxyFactoryclass的定义有一个编译器错误: 错误:32,47 java:type参数com.company.Factory.proxyUpdateable不在类型变量T的范围内 然而,当我替换proxyUpdateable的定义以简单地保存一个对象并删除它的类型参数时,代码就可以很好地编译了 为什么ProxyUpdateable的类型参数对其工厂实现ProxyFactory的边界有影响?就我所知,向ProxyUpdateable添加通用边界不会改变它实现的可更

我有以下类结构,其中ProxyFactoryclass的定义有一个编译器错误:

错误:32,47 java:type参数com.company.Factory.proxyUpdateable不在类型变量T的范围内

然而,当我替换proxyUpdateable的定义以简单地保存一个对象并删除它的类型参数时,代码就可以很好地编译了

为什么ProxyUpdateable的类型参数对其工厂实现ProxyFactory的边界有影响?就我所知,向ProxyUpdateable添加通用边界不会改变它实现的可更新接口的任何内容

停止使用原始类型

使用原始类型的行为似乎会导致此编译器错误。ProxyUpdateable是泛型的,因此在需要使用时添加泛型参数

要解决此问题,请将ProxyUpdateable的声明更改为:


我认为ProxyUpdateable中的T与工厂必须采用的类型之间没有关系。但我还没有测试过。请尝试更改类型变量名,然后仔细查看源代码,可能会出现一些问题。将proxyUpdateable更改为proxyUpdateable

不会修复编译器错误。因此,不确定为什么您认为它会掩盖某些内容。@markspace关系为ProxyFactory需要更新任何可能的Updateable实现。它通过在内部委托工厂T的更具体的实现,通过匹配updateable.getClass来实现这一点。这是有意义的,尽管我直到你发布之后才看到它。现在ProxyUpdateable中的类型T与其超类中的类型T相同。很好的发现。@Sweeper不幸的是,我需要原始类型来隐藏代理的内部类型。代理工厂将需要通过委托给T工厂的具体实现来创建所有可能类型的T的ProxyUpdateable实例。所以ProxyFactory将创建ProxyUpdateable实例,其中的实例将是ConcreteUpdateableA、ConcreteUpdateableB等等on@Tunji_D使用通配符怎么样?这有用吗?代理工厂扩展Factory@Tunji_D不幸的是,我需要一个原始类型来。。。不,你没有。只有在与Java 5之前的代码交互时才应使用原始类型。原始类型破坏了代码的类型安全性,因为您可以通过泛型传递参数的任何类型,而不仅仅是那些涉及省略的类型参数的类型,并且您可以将任何泛型返回值视为任何类型,尽管带有警告。通配符是正确的方法。@Sweeper我看错了你的第一个答案,替换了原始类型成功了!非常感谢

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> {
    }
}
static class ProxyUpdatable<T extends Updatable<T>> implements Updatable<ProxyUpdatable<T>> {
static class ProxyFactory<T extends Updatable<T>> extends Factory<ProxyUpdatable<T>> {