Posto il codice....

codice:
class Point { 
	int x, y; 
}

class ColoredPoint extends Point {
	int color;
	public void setColor(int c) { 
		color = c;
		
	}
}

public class Casting {
	public static void main(String[] args) {
		Point p = new Point();
		Point p2 = new ColoredPoint();
		ColoredPoint cp = new ColoredPoint();
		cp = (ColoredPoint)p; 		//Errore a run-time
		//cp = (ColoredPoint)p2;		//OK
		//Long l = (Long)p; 		//Errore in compilazione
		//int i = (int) p; 			//Errore in compilazione
		
		//cp.setColor(1);
		//p2.setColor(2);
		//((ColoredPoint)p2).setColor(2);
		//((ColoredPoint) p).setColor(4);
	}
}
Non capisco perchè vi sia un errore run-time quì:
cp = (ColoredPoint)p;,
stiamo effettuando un semplice cast narrowing,perchè?

Poi un altro errore run-time è
p2.setColor(2);
e dice che il metodo set color non appartiene a p2,ma allora a che serve fare così:
Point p2 = new ColoredPoint();
perchè si dichiara un oggetto di una classe invocando la new su una sottoclasse?