在下面的代码中
class A {
public void v(int... vals) {
System.out.println("Super");
}
}
class B extends A {
@Override
public void v(int[] vals) {
System.out.println("Sub");
}
}
Run Code Online (Sandbox Code Playgroud)
然后我可以称之为new B().v(1, 2, 3);//print Sub rather than Super荒谬但确实运作良好.如果我换B到
class B {
public void v(int[] vals) {
System.out.println("Not extending A");
}
}
Run Code Online (Sandbox Code Playgroud)
呼叫new B().v(1, 2, 3);将无效.你必须称之为new B().v(new int[]{1, 2, 3});,为什么?
为什么会这样?代码中的一行运行良好,而另一条相似的代码则没有.自动类型转换是否仅在某些条件下发生?我试图将gt.echoV()分配给一个对象,它运行良好; 但是当我将它分配给一个String时,同样的错误将再次出现.
public class GeneMethodTest {
public static void main(String... args) {
GeneMethodTest gt = new GeneMethodTest();
gt.<String>echoV(); //this line works well
gt.<String>echoV().getClass();//this line leads to a type cast exception
}
public <T> T echoV() {
T t=(T)(new Object());
return t;
}
}
Run Code Online (Sandbox Code Playgroud)