小编M. *_*sup的帖子

创建循环通用引用

我正在编写一个应用程序来在对等网络中进行一些分布式计算.在定义网络时,我有两类P2PNetwork和P2PClient.我希望这些是通用的,因此有以下定义:

P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>

P2PClient<T extends P2PNetwork<? extends T>>
Run Code Online (Sandbox Code Playgroud)

用P2PClient定义setNetwork(T网络)的方法.我希望用这段代码描述的是:

  1. P2P网络由特定类型的客户端构成
  2. P2PClient可能只属于其客户端与此客户端具有相同类型的网络(循环引用)

这似乎对我来说是正确的,但如果我尝试创建一个非泛型版本,如

MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
Run Code Online (Sandbox Code Playgroud)

和其他变种我从编译器收到很多错误.所以我的问题如下:

  1. 是否可以使用通用的循环引用(我从未见过明确禁止它的任何内容)?
  2. 上述通用定义是否是这种循环关系的正确定义?
  3. 如果它是有效的,它是描述这种关系的"正确"方式(即是否有另一个有效的定义,这在风格上是首选的)?
  4. 在给定正确的通用定义的情况下,如何正确定义客户端和服务器的非泛型实例?

java generics crtp circular-reference

17
推荐指数
1
解决办法
3069
查看次数

在方法签名/字段中查找不兼容性的工具

我希望能够比较类/库的两个版本,以确定是否有任何可能会破坏调用它的代码的更改.例如,考虑一些在版本a中有方法的类Foo:

public String readWidget(Object widget, Object helper);
Run Code Online (Sandbox Code Playgroud)

在版本b中,该方法变为:

public String readWidget(Object widget); //removed unnecessary helper object
Run Code Online (Sandbox Code Playgroud)

或者在字段的情况下类似的东西:

version a: public static Object sharedFoo;
version b: static Object sharedFoo; //moved to package private for version b
Run Code Online (Sandbox Code Playgroud)

我想要一个工具,将这些变化标记为潜在的不兼容性(但理想情况下不是相反的,即增加方法的可见性).现在我知道我可以通过反射或通过分析javap的输出来做到这一点,但是看起来应该有一个现有的工具(最好是非商业的).所以我想看看是否有人可以推荐一些东西,然后我犯了自己的错误/不必要地重新发明轮子.

java compatibility field method-signature

8
推荐指数
1
解决办法
98
查看次数

删除单元类方法

我一直在学习Groovy,目前正在研究元类功能.我已经看到了添加新方法和删除所有方法的示例,但没有关于删除单个方法的示例.例如:

String.metaClass.foo = {delegate.toUpperCase()}
String.metaClass.bar = {delegate.toLowerCase()}
Run Code Online (Sandbox Code Playgroud)

有明显的副作用.现在我已经看到你可以说了

String.metaClass = null
Run Code Online (Sandbox Code Playgroud)

删除所有方法.我希望有人能说些什么

String.metaClass.foo = null
Run Code Online (Sandbox Code Playgroud)

删除String.foo(),但仍保留String.bar(),但此语句似乎没有任何效果.有没有办法说方法foo()不应该再定义,而不影响bar()或任何其他添加的方法?

groovy metaclass

7
推荐指数
1
解决办法
2283
查看次数