public class Main {
public static void main(String[] args) {
Object[] array = new Object[1];
Piece piece = new Piece();
array[0] = piece;
array[0].move();
}
}
class Piece{
public void move(){
System.out.println("hello");
}
}
第6行不起作用,我不确定为什么。 array [0] 不应该给我 piece 和 piece.move() 调用类中的方法?
答案 0 :(得分:1)
在将Piece添加到Object数组中时,您将其转换为Object。
尝试一下:
public class Main {
public static void main(String[] args) {
Piece[] array = new Piece[1];
Piece piece = new Piece();
array[0] = piece;
array[0].move();
}
}
class Piece{
public void move(){
System.out.println("hello");
}
}
答案 1 :(得分:1)
这是因为在array[0] = piece;
行上您将Piece
对象分配给Object
,这是有效的,因为Object
是所有对象的父类。
但是,当您执行array[0].move();
时,您尝试从move()
类的引用中调用Object
方法。
这是不可能的,因为move()
类中没有声明Object
方法。
因此,您需要像下面这样投射:
((Piece)array[0]).move();
答案 2 :(得分:1)
将Piece
存储为Object
时,编译器不再知道它是Piece
。您必须明确地告诉它(将其广播((Piece)array[0]).move();
)。
或者将对象存储在Piece[] array
中。
我认为真正的动机是存储不同的作品类型。在这种情况下,它们都必须具有相同的基本类型。这可以通过使所有片段类型扩展相同的基类或实现公共接口来实现:
public class Main {
public static void main(String[] args) {
Movable[] array = new Movable[2];
APiece aPiece = new APiece();
BPiece bPiece = new BPiece();
array[0] = aPiece;
array[0].move();
array[1] = bPiece;
array[1].move();
}
}
interface Movable {
void move();
}
class APiece implements Movable{
@Override
public void move(){
System.out.println("APiece moved ");
}
}
class BPiece implements Movable{
@Override
public void move(){
System.out.println("BPiece moved ");
}
}