java - 嵌套泛型

标签 java generics

我有几门课:

标准类:

WorkflowGraph模型:

public class WorkflowGraphModel<T> implements IWorkflowGraphModel<T>

public WorkflowGraphModel( List<IWorkflowGraphEntry<T>> entries ) 
{
  this.entries = entries;
}

WorkflowGraphEntry:

public class WorkflowGraphEntry<T> implements IWorkflowGraphEntry<T>

特殊实现:

ApprovalStepGraphEntry

public class ApprovalStepGraphEntry extends WorkflowGraphEntry<ApprovalStep>

ApprovalStepGraphModel

public class ApprovalStepGraphModel extends WorkflowGraphModel<ApprovalStepGraphEntry>

public ApprovalStepGraphModel( List<ApprovalStepGraphEntry> stepEntries )
{
  super( stepEntries );
}

调用时出错

super( stepEntries );

WorkflowGraphModel (java.util.List>) WorkflowGraphModel 中的内容无法应用于 (java.util.List)

我不知道为什么编译器不知道 ApprovalStepGraphEntry 实现 IWorkflowGraphEntry。在我看来,泛型已经设置得很好。

最佳答案

类型List <IWorkflowGraphEntry <ApprovalStep>>不可从 List <ApprovalStepGraphEntry> 分配。你可能应该改变 List <IWorkflowGraphEntry <ApprovalStep>>List<? extends IWorkflowGraphEntry <ApprovalStep>>或类似的东西。

这里解释了为什么上述类型不兼容。让我们考虑一下我们有:

interface A {...}
class B extends A {...}
class B1 extends A {...}
interface C <T> {public void set (T t);}

那么下列说法不正确:

C <A> ca;
C <B> cb = ...;
ca = cb; // Error here
ca.set (new B1 ()); // Correct!

注意一次ca声明为C <A> ca ,方法ca.set接受 A 类型的参数因此new B1()是它的有效值。同时,方法cb.set接受 B 类型的参数,因此 new B1()不是此参数的有效值。如果我们能够分配 cbca ,那么我们稍后就可以调用ca.set (new B1())它将把无效类型的值传递给 set 方法。为了防止这种情况,编译器将 C <A> 视为和C <B>即使 A 类型也不兼容和B兼容。

关于java - 嵌套泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15197675/

相关文章:

java - 为什么 receive() 方法没有从客户端接收数据?

java - 在Android应用程序中不要硬编码的内容

java - 将图像转换为可搜索的 pdf

Java访问类变量?

java - 为什么有些方法中泛型参数<T>会变成<S>

java - 如何实现 Java 通用数据结构,避免类型删除转换问题

java - 无法在 WLS 中使用 Logback

java - "<T extends Comparable<T>>"和 "<T extends Comparable<Comparable<T>>>"之间的区别?

java - 不兼容的类型 : ArrayList<C<CAP#1>> cannot be converted to ArrayList<C<? >>

java - 我们可以在将字符串加载到 Arraylist 对象时限制特定的字符串大小写吗?