Java 不兼容类型-使用泛型时找到对象

Java 不兼容类型-使用泛型时找到对象,java,Java,我遇到了一个问题,下面的循环抛出了一个错误不兼容的类型:Required:Workstation,Found:java.lang.Object 所有的东西都被类型化了,我不明白为什么它会找到一个对象而不是类型化的对象 private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(Collection<WorkflowProcess> workflowProcesses) { for (Workf

我遇到了一个问题,下面的循环抛出了一个错误
不兼容的类型:Required:Workstation,Found:java.lang.Object

所有的东西都被类型化了,我不明白为什么它会找到一个对象而不是类型化的对象

private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(Collection<WorkflowProcess> workflowProcesses) {
    for (WorkflowProcess workflowProcess : workflowProcesses) {
        for (Workstation workstation : workflowProcess.getWorkstations()) //ERROR IS HERE
私有静态工作流流程getWorkflowProcessByWorkstationRecursive(集合工作流流程){
for(WorkflowProcess WorkflowProcess:WorkflowProcess){
for(工作站:workflowProcess.getWorkstations())//此处有错误
WorkflowProcess.java

abstract public class WorkflowProcess<WorkstationType extends Workstation> {

    private ArrayList<WorkstationType> workstationList = new ArrayList<WorkstationType>();

    public ArrayList<WorkstationType> getWorkstations() {
        return workstationList;
    }
abstract public class ServerWorkflowProcess extends WorkflowProcess<ServerWorkstation> {
abstract public class ServerWorkstation extends Workstation<ServerWorkflowProcess> {
抽象公共类工作流过程{
private ArrayList workstationList=新建ArrayList();
公共阵列列表getWorkstations(){
返回工作站列表;
}
ServerWorkflowProcess.java

abstract public class WorkflowProcess<WorkstationType extends Workstation> {

    private ArrayList<WorkstationType> workstationList = new ArrayList<WorkstationType>();

    public ArrayList<WorkstationType> getWorkstations() {
        return workstationList;
    }
abstract public class ServerWorkflowProcess extends WorkflowProcess<ServerWorkstation> {
abstract public class ServerWorkstation extends Workstation<ServerWorkflowProcess> {
抽象公共类ServerWorkflowProcess扩展了WorkflowProcess{
ServerWorkstation.java

abstract public class WorkflowProcess<WorkstationType extends Workstation> {

    private ArrayList<WorkstationType> workstationList = new ArrayList<WorkstationType>();

    public ArrayList<WorkstationType> getWorkstations() {
        return workstationList;
    }
abstract public class ServerWorkflowProcess extends WorkflowProcess<ServerWorkstation> {
abstract public class ServerWorkstation extends Workstation<ServerWorkflowProcess> {
抽象公共类ServerWorkstation扩展工作站{
它变得有点复杂,但本质上类层次结构如下所示:

SpecificWorkflowProcess
extends
TypeOfWorkflowProcess
extends
WorkflowProcess

特定工作站
扩展
工作站类型
扩展
工作站


workflowprocesss
to
Workstation
=一对多

问题是您使用的是原始类型
WorkflowProcess
。这意味着您得到的API实际上是对普通API的擦除,因此
getWorkstations
的返回类型变成了
ArrayList

您可以通过以下方式轻松解决此问题:

private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(
    Collection<WorkflowProcess<?>> workflowProcesses) {
  for (WorkflowProcess<?> workflowProcess : workflowProcesses) {
    ..
  }
}
私有静态WorkflowProcess getWorkflowProcessByWorkstationRecursive(
集合工作流进程:工作流进程){
..
}
}

通过使用通配符,您基本上是在说“我知道这里涉及泛型,但实际上我并不介意集合中的
WorkstationType
type参数是什么”.

问题是您使用的是原始类型
WorkflowProcess
。这意味着您得到的API实际上是对普通API的擦除,因此
getWorkstations
的返回类型变成了
ArrayList

您可以通过以下方式轻松解决此问题:

private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(
    Collection<WorkflowProcess<?>> workflowProcesses) {
  for (WorkflowProcess<?> workflowProcess : workflowProcesses) {
    ..
  }
}
私有静态WorkflowProcess getWorkflowProcessByWorkstationRecursive(
集合工作流进程:工作流进程){
..
}
}

通过使用通配符,您基本上是在说“我知道这里涉及泛型,但实际上我并不介意集合中的
WorkstationType
类型参数是什么”。

您必须将泛型参数添加到第二行的
workflowProcess
类型中:

private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(Collection<WorkflowProcess> workflowProcesses) {
    for (WorkflowProcess<Workstation> workflowProcess : workflowProcesses) {
        for (Workstation workstation : workflowProcess.getWorkstations())
私有静态工作流流程getWorkflowProcessByWorkstationRecursive(集合工作流流程){
for(WorkflowProcess WorkflowProcess:WorkflowProcess){
用于(工作站:workflowProcess.getWorkstations())

您必须将通用参数添加到第二行的
工作流流程类型中:

private static WorkflowProcess getWorkflowProcessByWorkstationRecursive(Collection<WorkflowProcess> workflowProcesses) {
    for (WorkflowProcess<Workstation> workflowProcess : workflowProcesses) {
        for (Workstation workstation : workflowProcess.getWorkstations())
私有静态工作流流程getWorkflowProcessByWorkstationRecursive(集合工作流流程){
for(WorkflowProcess WorkflowProcess:WorkflowProcess){
用于(工作站:workflowProcess.getWorkstations())

WorkflowProcess#getWorkstations()
声明?通常,最好先从文件中的第一个错误或警告开始。
WorkflowProcess#getWorkstations()
声明?一般来说,最好先从文件中的第一个错误或警告开始。如果我知道列表在某种程度上总是
扩展工作站
,是否最好总是执行
?扩展工作站
?@Webnet:您已经知道了,因为它在
WorkstationType
类型的描述中参数…它不可能是其他任何东西。如果我知道列表在某种程度上总是
扩展工作站
,那么最好总是做一个
?扩展工作站
?@Webnet:你已经知道了,因为它在
WorkstationType
类型参数的描述中…它不可能是任何东西g其他。