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方法,它具有泛型类型。我想有人可以编写类似的方法——当您动态选择应该返回的枚举类型时。