我有一个便利功能,它接受各种类型的对象并以可序列化的方式转换它们。例如,类似JSON的对象被转换为JSON:
public static <T> String process( List<T> list ) {
if( list instanceof JSONArray ) {
return ((JSONArray) list).toJSONString( );
}
// stringify the list
}
public static String process( JSONAware object ) { // array, map, value, ...
return object.toJSONString( );
}
我正在使用org.json.simple
库,所以JSONArray extends ArrayList implements JSONAware
。但这意味着当我发送JSONArray时,我得到:
对流程的引用含糊不清
我知道它可以同样适用于任何一种方法,这就是为什么我在两者中都有相同的实现。
显然,我可以用一个采用任意Object
类型的函数替换这两个函数,但这会删除很多我不满意的编译时检查。我还可以重命名其中一个函数来强制进行特定选择,但这会使API变得复杂。
是否有某些方法可以强制进行特定选择,或者让编译器明白在这些情况下调用哪个方法并不重要?
答案 0 :(得分:0)
您可以添加
public static void process(JSONArray array) {
process((JSONAware) array);
}
虽然它不是一般解决方案,但在这种情况下它会解决它。
在这个例子中
public class Example {
static class A {
}
interface B {
}
static class C extends A implements B {
}
static void process(A a) {
}
static void process(B b ) {
}
static void process(C c) {
System.out.println("process C called");
}
public static void main(String... ignored) {
process(new C());
}
打印
process C called