高级农民
- 积分
- 2724
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-6-18
- 最后登录
- 1970-1-1
|
这个题目出得很不严谨,因为认真考虑的话要处理的情况是非常多的(例如隐式类型转换、变长参数等等),面试小哥估计也是半桶水晃荡..
相关知识点本质上是与编译器前端中的function (overload) resolution有关,看起来楼主面试语言应该是Java,那么是要用Java reflection的一些技术
写了一份参考代码:
- import java.lang.reflect.Method;
- import java.util.HashMap;
- class Solution {
- private static final HashMap<Class<?>, Class<?>> primitiveTypes =
- new HashMap<Class<?>, Class<?>>() {{
- put(boolean.class, Boolean.class);
- put(byte.class, Byte.class);
- put(char.class, Character.class);
- put(double.class, Double.class);
- put(float.class, Float.class);
- put(int.class, Integer.class);
- put(long.class, Long.class);
- put(short.class, Short.class);
- put(void.class, Void.class);
- }};
- public boolean testFunction(final Class<?> target,
- final Class<?> expected,
- final Object... args) {
- // 实参类型
- Class<?>[] actualTypes = new Class[args.length];
- for (int i = 0; i < args.length; ++i) {
- actualTypes[i] = args[i].getClass();
- }
- // 遍历所有method,匹配参数类型以及结果类型
- for (Method method : target.getMethods()) {
- if (checkEquivalence(method.getParameterTypes(), actualTypes) &&
- checkEquivalence(method.getReturnType(), expected, false)) {
- return true;
- }
- }
- return false;
- }
- private boolean checkEquivalence(final Class<?>[] formalTypes,
- final Class<?>[] actualTypes) {
- // 如果要支持对变长参数(varargs)的检测,这里要写得更复杂一些
- if (actualTypes.length != formalTypes.length) {
- return false;
- }
- for (int i = 0; i < formalTypes.length; ++i) {
- if (!checkEquivalence(formalTypes[i], actualTypes[i], true)) {
- return false;
- }
- }
- return true;
- }
- private boolean checkEquivalence(Class<?> formalType,
- Class<?> actualType,
- final boolean allowImplicitTypeCast) {
- if (primitiveTypes.containsKey(formalType)) {
- formalType = primitiveTypes.get(formalType);
- }
- // 这种简单写法可以支持隐式upcast,例如String -> Object
- // 但是不支持隐式primitive类型转换,例如int -> float
- // 如果要支持后者需要更大的代码量
- return allowImplicitTypeCast ? formalType.isAssignableFrom(actualType)
- : formalType.equals(actualType);
- }
- }
- // 用于测试的class
- class TestCase {
- public int f(int x, int y) {
- return x + y;
- }
- public double g(String x, double y) {
- return x.length() * y;
- }
- public String h(long id, String[] values) {
- return "[" + id + "] " + String.join(" ", values);
- }
- }
- public class Main {
- public static void main(String[] args) {
- Solution solution = new Solution();
- // 测试 Solution.f
- // true
- System.out.println(solution.testFunction(TestCase.class, Integer.class, 1, 2));
- // false, 参数数量不匹配
- System.out.println(solution.testFunction(TestCase.class, Integer.class, 1, 2, 3));
- // false, 第一个参数类型不匹配
- System.out.println(solution.testFunction(TestCase.class, Integer.class, 1.5, 2));
- // 测试 Solution.g
- // true
- System.out.println(solution.testFunction(TestCase.class, Double.class, "Hello", 1.5));
- // false,返回值类型不匹配
- System.out.println(solution.testFunction(TestCase.class, String.class, "Hello", 1.5));
- // 测试 Solution.h
- // true
- System.out.println(solution.testFunction(TestCase.class, String.class, 1L, new String[] {"a", "b"}));
- // false, 参数类型不匹配
- System.out.println(solution.testFunction(TestCase.class, String.class, "Hello", new String[] {"a", "b"}));
- // false, Solution里面的代码不支持隐式基础类型转换
- System.out.println(solution.testFunction(TestCase.class, String.class, 1, new String[] {"a", "b"}));
- }
- }
复制代码 |
|