我正在编写一个应用程序来在对等网络中进行一些分布式计算.在定义网络时,我有两类P2PNetwork和P2PClient.我希望这些是通用的,因此有以下定义:
P2PNetwork<T extends P2PClient<? extends P2PNetwork<T>>>
P2PClient<T extends P2PNetwork<? extends T>>
Run Code Online (Sandbox Code Playgroud)
用P2PClient定义setNetwork(T网络)的方法.我希望用这段代码描述的是:
这似乎对我来说是正确的,但如果我尝试创建一个非泛型版本,如
MyP2PClient<MyP2PNetwork<? extends MyP2PClient>> myClient;
Run Code Online (Sandbox Code Playgroud)
和其他变种我从编译器收到很多错误.所以我的问题如下:
我希望能够比较类/库的两个版本,以确定是否有任何可能会破坏调用它的代码的更改.例如,考虑一些在版本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的输出来做到这一点,但是看起来应该有一个现有的工具(最好是非商业的).所以我想看看是否有人可以推荐一些东西,然后我犯了自己的错误/不必要地重新发明轮子.
我一直在学习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()或任何其他添加的方法?