考慮下面的代碼工作:的Java:在編譯時對象的隱式轉換不工作,但與反思
import java.lang.reflect.Array;
import java.lang.reflect.Method;
public class Test {
public static void test_function(int[] values) {
System.out.println("Class of values : " + values.getClass());
System.out.println(values[0]);
}
public static void main(String[] args) {
Object a = Array.newInstance(int.class, 3);
Array.set(a, 0, 5);
Class a_class = a.getClass();
Class int_array_class = int[].class;
System.out.println("Class of int[] : " + int[].class);
System.out.println("Class of a : " + a.getClass());
System.out.println("int_array_class : " + int_array_class);
System.out.println("a_class : " + a_class);
// These instructions will provoke a compile-time error
// test_function(a);
// test_function(a_class.cast(a));
// test_function(int_array_class.cast(a));
// The following call won't cause any problem
test_function((int[]) a);
Method testf = null;
try {
testf = Test.class.getMethod("test_function", int[].class);
testf.invoke(null, a); // Does not provoke exception at run-time either
testf.invoke(null, a_class.cast(a));
testf.invoke(null, int_array_class.cast(a));
}
catch(Exception e) {
e.printStackTrace();
}
}
}
我注意到,通過明確對象的方法不起作用。這三個評論說明會招來以下錯誤,如果未加註釋:
Test.java:25: error: method test_function in class Test cannot be applied to given types;
test_function(a);
^
required: int[]
found: Object
reason: actual argument Object cannot be converted to int[] by method invocation conversion
Test.java:26: error: method test_function in class Test cannot be applied to given types;
test_function(a_class.cast(a));
^
required: int[]
found: Object
reason: actual argument Object cannot be converted to int[] by method invocation conversion
Test.java:27: error: method test_function in class Test cannot be applied to given types;
test_function(int_array_class.cast(a));
^
required: int[]
found: Object
reason: actual argument Object cannot be converted to int[] by method invocation conversion
3 errors
然而,傳遞對象通過反射做工精細,併產生預期的結果。
Class of int[] : class [I
Class of a : class [I
int_array_class : class [I
a_class : class [I
Class of values : class [I
5
Class of values : class [I
5
Class of values : class [I
5
Class of values : class [I
5
所以,問題是:爲什麼編譯器拒絕編譯在運行時正常工作三個commentend說明?