Java 枚举为类内的泛型类型,但使用方法需要显式强制转换
我正在使用枚举作为类的泛型类型参数。问题是,如果没有显式强制转换,我无法使用它的方法(这一定是由于运行时类型擦除)。 考虑以下事项:Java 枚举为类内的泛型类型,但使用方法需要显式强制转换,java,generics,enums,Java,Generics,Enums,我正在使用枚举作为类的泛型类型参数。问题是,如果没有显式强制转换,我无法使用它的方法(这一定是由于运行时类型擦除)。 考虑以下事项: public enum TaskDetail { CAR_WASH(100, 2); private int serviceFees; //Something else. public int getServiceFees() { return serviceFees; } } 我在课堂上使用此类型作为:
public enum TaskDetail {
CAR_WASH(100, 2);
private int serviceFees;
//Something else.
public int getServiceFees() {
return serviceFees;
}
}
我在课堂上使用此类型作为:
public class Task<E extends Enum<TaskDetail>> implements Runnable {
private E taskDetail;
public Task(E taskDetail) {
this.setTaskDetail(taskDetail);
}
@Override
public void run() {
//do something with taskDetail:
//not able to access methods without explicit cast.
}
public static void main(String[] args) {
Task<TaskDetail> t = new Task<TaskDetail>(TaskDetail.CAR_PAINT);
t.taskDetail.getServiceFees(); //This is fine.
}
}
公共类任务实现可运行{
私人E-taskDetail;
公共任务(E任务详细信息){
此.setTaskDetail(taskDetail);
}
@凌驾
公开募捐{
//对taskDetail执行某些操作:
//没有显式强制转换,无法访问方法。
}
公共静态void main(字符串[]args){
Task t=新任务(TaskDetail.CAR\u PAINT);
t、 taskDetail.getServiceFees();//这很好。
}
}
为什么我不能这样做?我可能把某些东西误认为是正常的类类型参数,这是可能的。在任务类中不需要泛型类型,这很好
public class Task implements Runnable {
private TaskDetail taskDetail;
public Task(TaskDetail taskDetail) {
this.setTaskDetail(taskDetail);
}
@Override
public void run() {
}
public static void main(String[] args) {
Task t = new Task(TaskDetail.CAR_WASH);
t.taskDetail.getServiceFees(); //This is fine.
}
}
在任务类中不需要泛型类型,这很好
public class Task implements Runnable {
private TaskDetail taskDetail;
public Task(TaskDetail taskDetail) {
this.setTaskDetail(taskDetail);
}
@Override
public void run() {
}
public static void main(String[] args) {
Task t = new Task(TaskDetail.CAR_WASH);
t.taskDetail.getServiceFees(); //This is fine.
}
}
为什么将任务定义为
Task
?@wero我想根据类型创建不同类型的任务,以便使用TaskDetail中包含的信息(如任务时间和持续时间)。@abksrv:听起来好像你在混淆类型和枚举常量。无法创建任务
;你不能基于非类型参数化类型,而且洗车不是一种类型。为什么你将任务定义为任务?@wero我想基于类型创建不同类型的任务,以便使用TaskDetail中包含的信息(如任务时间和持续时间)。@abksrv:听起来你好像把类型和枚举常量混在一起了。无法创建任务
;你不能基于非类型参数化类型,CAR\u WASH
不是一个类型。我明白了。但是有没有一种方法可以将枚举用作类型参数?@abksrv check Enum#valueOf方法,它具有泛型类型。我想有人可以编写类似的方法——当您动态选择应该返回的枚举类型时,我明白了。但是有没有一种方法可以将枚举用作类型参数?@abksrv check Enum#valueOf方法,它具有泛型类型。我想有人可以编写类似的方法——当您动态选择应该返回的枚举类型时。