Tag: crtp

如何在java中强制转换为CRTP?

我有一个非常简单的例子,我做了一些基本的通用赋值: final Detail detail = field.getAnnotation(Detail.class); final String example = detail.example(); final Class type = field.getType(); if (List.class.isAssignableFrom(type)) … else if (Enum.class.isAssignableFrom(type)) setValue(contract, field, Enum.valueOf(type, example)); else if (…) ….. 但是Enum.valueOf()有点难以调用,在我的例子中,错误是: java.lang.Enum中的valueOf(java.lang.Class,java.lang.String)不能应用于(java.lang.Class,java.lang.String) 这非常有意义,因为type是Class 。 但由于Enum是CRTP,我找不到一种好的方法来转换类型以使编译器满意。 是使用原始类型Enum.valueOf((Class)type, example))唯一的答案? 它给了我2个警告,而不是只有一个。

创建循环通用引用

我正在编写一个应用程序来在对等网络中进行一些分布式计算。 在定义网络时,我有两类P2PNetwork和P2PClient。 我希望这些是通用的,因此有以下定义: P2PNetwork<T extends P2PClient<? extends P2PNetwork>> P2PClient<T extends P2PNetwork> 用P2PClient定义setNetwork(T网络)的方法。 我希望用这段代码描述的是: P2P网络由特定类型的客户端构成 P2PClient可能只属于其客户端由与此客户端相同类型的网络(循环引用) 这似乎对我来说是正确的,但如果我尝试创建一个非generics版本,如 MyP2PClient<MyP2PNetwork> myClient; 和其他变种我从编译器收到很多错误。 所以我的问题如下: 是否可以使用通用循环引用(我从未见过明确禁止它的任何内容)? 上述通用定义是否是这种循环关系的正确定义? 如果它是有效的,它是描述这种关系的“正确”方式(即是否有另一个有效的定义,这在风格上是首选的)? 在给定正确的通用定义的情况下,如何正确定义客户端和服务器的非generics实例?