避免由extends / implements引起的模糊方法

时间:2014-01-26 15:18:31

标签: java generics operator-overloading

我有一个便利功能,它接受各种类型的对象并以可序列化的方式转换它们。例如,类似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变得复杂。

是否有某些方法可以强制进行特定选择,或者让编译器明白在这些情况下调用哪个方法并不重要?

1 个答案:

答案 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