gpt4 book ai didi

Java 类内部泛型绑定(bind)掩盖了父接口(interface)泛型绑定(bind)定义

转载 作者:行者123 更新时间:2023-11-30 06:44:54 25 4
gpt4 key购买 nike

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

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

我替换 ProxyUpdatable 定义的那一刻然而,简单地持有一个对象并删除它的类型参数,代码编译得很好。

为什么ProxyUpdatable的类型参数对其工厂实现的范围有影响 ProxyFactory ?据我所知,将通用边界添加到 ProxyUpdatable没有改变它实现的接口(interface)的任何内容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>> {

关于Java 类内部泛型绑定(bind)掩盖了父接口(interface)泛型绑定(bind)定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49958764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com