给出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()函数所需的类。
是否有一种方法可以通过最少的修改/解析来解决此错误?
答案 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;
}
}