I am having trouble understanding what is actually happening when I declare the array in the following code.
class Type1 {
}
class Type2 extends Type1 {
public void method2() {
}
}
class Test {
public static void main(String[] args) {
Type1[] x = new Type2[2];
x[0] = new Type1(); // runtime error
x[1] = new Type2();
x[1].method2(); // syntax error
}
}
I thought since the right-hand side of the array declaration is new Type2[2]
that the array would consist of reference variables of the type Type2
. If this is true, the first error makes sense because I cannot have a subtype referring to a supertype.
However, why does the second error occur two lines after that? Isn't method2()
known by Type2, so the method is known by the reference variable? It seems it is because Type1
doesn't know method2
, so does that mean the array consists of reference variables of the type Type1
? If this is true, why does the first error occur as it is no longer a subtype referring to a supertype?
Also, why is the first error a runtime error while the other is a syntax error?
Please note I am only in my second programming course, so my terminology may be a little off.
Edit: The question here does not answer my question because it does not answer why an element of an array like x
cannot invoke method2()
even though an element of x
of Type 2
. My question is different because of this and because my question also asks why the first error occurs when the second error also occurs (why an element of x
cannot refer to and object of the type Type1
and at the same time cannot invoke method2()
). I originally thought that if one error occurred, then the other cannot occur. I wanted a comparison between the two errors and a more in-depth explanation than simply the rules of polymorphism.