java - 如何在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();
给Enum
of state
type 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 类型的新类。
是否可以使用提供的代码来实现这一点以及如何修复它?
解决方案
我认为您正在寻找的是:
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>
当然可以兼容设置为类型的变量S
,S state = getOneState()
从中可以得到什么
您应该努力避免使用原始类型,因为它们放弃了泛型的类型安全性,并且通常不会与其他泛型配合得很好,正如您在这里所经历的那样。
推荐阅读
- c# - 使用 HttpContent.ReadAsAsync 时代码停止
- postgresql - 备份 keycloak 数据库会备份所有内容吗?
- django - 如何将表单字段错误返回到在不同的 Django 视图中呈现的模板
- css - 如何为 SVG SMIL 动画添加缓动?
- twitter-bootstrap - Laravel 混合 | Bootstrap 弃用警告:不推荐使用 / 进行除法,并将被删除
- node.js - Mongoose 在测试中不抛出 E11000 重复键错误
- java - Volley CallBack 方法没有给出响应?
- vb.net - 除数而不四舍五入且不带小数
- eclipse - 使用 Eclipse 调试 MBED
- python - 使用 python 在 JIRA 中更新受让人和评论字段时出错