这是对我向一群学生提出的问题的解释,结果发现找到一个答案对我来说有点棘手(无论如何),而不是我的预期:
假设您要求我编写一个具有String参数的方法f,并返回一个double。您现在希望通过编写自己的测试代码来测试我是否已经正确地完成了我的工作,如果我已经按照指定编写了f,则会编译,但如果我没有编译,则无法编译。
有些学生提出了这个错误的解决方案:
System.out.println(f("cat"));
这不是一个好的测试人员,因为它不测试方法的返回类型。也就是说,即使我写了f来返回一个String或一个int或一个布尔值,它也会编译。依此类推。
我向学生们提出了这个解决方案:
double d = f("cat");
我推断这会测试f是否接受字符串并返回双精度数。但实际上,这也不好。 f可以返回一个int(或任何“较窄”的原始数据类型),结果可以存储在d中。
那么,我正在寻找一个简单解决方案(可能是一行或两行代码?)的问题:编写代码,如果f已经正确定义将编译(字符串参数,双返回),但如果未按指定编写f,则不会编译。
答案 0 :(得分:4)
一般来说,反射是最合适的(它是一个非常不寻常的要求)但是至少可以使用重载决策的其他东西:提供参数为float
的替代方法,{ {1}}和long
,但Double
返回类型...以及一个参数类型为void
且非void返回类型的方法。然后检查是否可以为调用该方法的结果赋值double
。例如:
f
答案 1 :(得分:1)
这是一个编译时断言(尽管它会为Double
和Object
产生误报):
List<Double> a = new ArrayList<Double>();
a.add(f("cat"));
或者简单地说:
double[] a = {f("cat")};
这是一个运行时断言(虽然它会为Double
,Float
和float
产生误报:
try
{
double d = f("cat")/0;
}
catch (Exception e)
{
return false;
}
return true;
答案 2 :(得分:0)
使用反射:获取与名称f和参数类型String匹配的类java.lang.reflect.method的实例,该实例使用返回类型等于Double.TYPE
来自Double类的课程文档:
public static final Class TYPE表示基本类型double
的Class实例答案 3 :(得分:0)
我们可以返回Object类型而不是在IDE的编译器选项中禁用自动装箱以获取错误以获得确切的返回类型.ex:int不能返回Integer..etc
对于基元,我们需要反射,这可能是一个有点繁重的操作。