Java,与对象无关的空返回

时间:2018-09-01 05:04:29

标签: java

给出Java源代码和预处理器(如C ++),我想用返回null的函数替换所有对null的提及。它会找到对null的调用,并将其替换为以下函数。

public static Object returnNull(){
    return null;
}

这失败了,因为有各种各样的类,并且:

functionThatWantsCustomClass( returnNull() ); //Object cannot be converted to CustomClass

if( cc == returnNull() ) //Object cannot be converted to CustomClass

我能想到的最简单的解决方案是必须对预处理器进行参数化,尽管这将需要遍历每个null来手动添加参数,例如:null/*CustomClass*/

另一种方法是花费大量时间编写更好的解析器,因此它始终知道returnTypedNull()函数所需的类。

是否有一种方法可以通过最少的修改/解析来解决此错误?

2 个答案:

答案 0 :(得分:4)

使用generics

public static <T> T returnNull() {
    return (T) null;
}

评论的后续关注

下面的代码尽可能地接近注释,并且可以很好地编译:

public class Test {
    public static void main(String[] args) {
        CustomClass cc = new CustomClass();
        if (cc != returnNull())
            cc.errlog( returnNull() );
    }
    public static <T> T returnNull() {
        return (T) null;
    }
}
class CustomClass {
    void errlog(Exception e) {
    }
}

现在,如果有2个errlog方法仅具有一个非基本参数:

class CustomClass {
    void errlog(Exception e) {
    }
    void errlog(String s) {
    }
}

然后它将失败,并显示错误The method errlog(Exception) is ambiguous for the type CustomClass,因为编译器不知道T应该是Exception还是String,即要调用两者中的哪一个。

您必须明确告诉编译器:

cc.errlog( Test.<Exception>returnNull() );

答案 1 :(得分:1)

使用generics蚂蚁将起作用。 示例:

public class ReturnNullExample {

    public static void main(String[] args) {

        ReturnNullExample example = new ReturnNullExample();
        example.someMethod(ReturnNullClass.returnNull());

        CustomClass cc = null;
        if(cc == ReturnNullClass.returnNull()) {
            System.out.println("cc is null");
        }

        cc = new CustomClass();
        if(cc != ReturnNullClass.returnNull()) {
            System.out.println("cc is not null");
        }
    }

    public void someMethod(CustomClass customClass) {
        System.out.println("This method does nothing");
    }
}

class CustomClass {

    private int number;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

class ReturnNullClass {

    public static <T> T returnNull() {
        return null;
    }
}