首页 > 解决方案 > 如何在Java中修复“类型参数S不在类型变量E的范围内”

问题描述

我正在尝试通过使用接口定义一些基本访问方法来对不同的 Enum 类进行多态访问。例如:

package com.company;

public interface StatesInterface<E extends Enum<E>> {

    E getOneState();
    E getTwoState();
    E getThreeState();
}

和一些实现:

package com.company;

public enum States implements StatesInterface<States> {

    ONE, TWO, THREE, FOUR;

    @Override
    public States getOneState() {
        return ONE;
    }
    @Override
    public States getTwoState() {
        return TWO;
    }
    @Override
    public States getThreeState() {
        return THREE;
    }
}

注意:我知道这段代码有问题,因为接口通过非静态接口提供静态枚举值,但我不知道如何解决它。

当我尝试将此接口用作类中的类型约束时,我遇到了类型错误。例如:

package com.company;

public class Lifecycle<S extends StatesInterface> {

    private S state;

    public void transit() {
        state = state.getOneState(); // <---- incompatible types
    }
}

在这种情况下,我无法将 type 分配state.getOneState();Enumof statetype StatesInterface<Enum>

当我尝试将泛型类型更改为Lifecycle<S extends StatesInterface<S>>编译时,我说Error:(3, 50) java: type argument S is not within bounds of type-variable E

我的目标是创建一组具有通用接口的不同 Enum 类,以创建一个将类泛化Lifecycle为特定 Enum 类型的新类。

是否可以使用提供的代码来实现这一点以及如何修复它?

标签: javagenerics

解决方案


我认为您正在寻找的是:

class Lifecycle<S extends Enum<S> & StatesInterface<S>>

相比之下,您的定义如下:

interface StatesInterface<E extends Enum<E>>

enum States implements StatesInterface<States>

class Lifecycle<S extends StatesInterface>

然后getOneState()只返回一个 type Object extends Enum<Object>,因为您使用的是原始类型StatesInterface因为没有给它类型参数,这与 type 不兼容S extends StatesInterface,因此给了你"Type mismatch: cannot convert from Enum to S"

通过将您的定义更改为class Lifecycle<S extends Enum<S> & StatesInterface<S>>您允许getOneState()返回S extends Enum<S> & StatesInterface<S>当然可以兼容设置为类型的变量SS state = getOneState()


从中可以得到什么

您应该努力避免使用原始类型,因为它们放弃了泛型的类型安全性,并且通常不会与其他泛型配合得很好,正如您在这里所经历的那样。


推荐阅读