根据这个问题 ,当尝试在模糊的重载构造函数之间进行select时,Java将select“最具体的”选项。 在这个例子中: public class Test{ private Test(Map map){ System.out.println("Map"); } private Test(Object o){ System.out.println("Object"); } public static void main(String[] args){ new Test(null); } } 它会打印 “地图” 但是,我试图弄清楚“最具体”的含义。 我认为这意味着“最不明确”,就像“可能指的是尽可能less的types”。 在这种情况下, Object可能是任何不是原始的东西,而Map可能只是Map或? extends Map ? extends Map 。 基本上,我认为select哪个类更靠近inheritance树的叶子。 当一个类是另一个类的子类时,这是有效的: public class Test{ private Test(A a){ System.out.println("A"); } private Test(B b){ System.out.println("B"); } public static void […]
我正在学习C ++中的函数重载,并且遇到了这个问题: void display(int a) { cout << "int" << endl; } void display(unsigned a) { cout << "unsigned" << endl; } int main() { int i = -2147483648; cout << i << endl; //will display -2147483648 display(-2147483648); } 从我的理解,在int范围(在我的情况下int是4字节)给出的任何值将调用display(int) ,超出此范围的任何值将是不明确的(因为编译器无法决定调用哪个函数)。 它对整个int值的范围是有效的,除了最小值,即-2147483648 ,其中编译失败并带有错误 重载display(long int)调用是不明确的 但是将相同的值2147483648 int并打印该值将会产生2147483648 。 我真的与这种行为混淆。 为什么只有当最负数字通过时才会观察到这种行为? (如果一个short和-32768使用,行为是一样的 – 事实上,在任何情况下,负数和正数都有相同的二进制表示) 使用的编译器:g ++(GCC)4.8.5