这是超级
package elements;
import persistence.postgres.DataSource;
import persistence.postgres.IdBroker;
import persistence.postgres.PersistenceException;
import util.Util;
public class Hotspot {
private double lat;
private double lng;
private long id;
private String username;
private String time_stamp;
private String point_of_interest;
private String comment;
public Hotspot(double lat, double lng, String username, String comment, String p_o_i) {
this.lat = lat;
this.lng = lng;
this.username = username;
try {
this.id = IdBroker.getId(new DataSource().getConnection());
} catch (PersistenceException e) {
e.printStackTrace();
}
time_stamp = Util.timeStamp();
this.comment = comment;
this.point_of_interest = p_o_i;
}
public Hotspot(double lat, double lng, String username, long id, String time_stamp) {
this.lat = lat;
this.lng = lng;
this.username = username;
this.id = id;
this.time_stamp = time_stamp;
}
//Getter Setter for all variable and HashCode/Equals
}
这是次要的
package persistence.postgres;
import elements.Details;
import elements.Hotspot;
public class HotspotProxy extends Hotspot {
private HotSpotDAOpostgres hsd;
private Details details;
//insert
public HotspotProxy(double lat, double lng, String username, String comment, String poi) {
super(lat, lng, username, comment, poi);
this.hsd = new HotSpotDAOpostgres();
}
//Retrieve
public HotspotProxy(double lat, double lng, String username, long id, String time_stamp) {
super(lat, lng, username, id, time_stamp);
this.hsd = new HotSpotDAOpostgres();
}
public String getPointOfInterest() {
redifined method
}
public String getComment() {
//redifined method
}
}
这给了我错误
Hotspot h = new Hotspot(31.124, 43.123, "name", "comment", "point of interest");
HotspotProxy hp = (HotspotProxy)h;
请告诉我哪里失败了。感谢任何suggention
答案 0 :(得分:7)
Hotspot := Animal
HotspotProxy := Dog
您可以将Dog
转换为Animal
(从特殊到普通,或者换句话说,从子类到基类),但不是相反(从一般到特殊,或在其他方面)从基类到子类的单词),因为每个Dog
都是Animal
,但不是每个Animal
都是Dog
。
如果您有类似
的内容Animal a = new Dog();
然后,允许以下内容:
Dog d = (Dog) a;
因为a
实际上是Dog
。
答案 1 :(得分:2)
您无法将超类的实例强制转换为子类。
HotspotProxy
也是Hotspot
,但并非所有 Hotspot
都是HotspotProxy
s。
请注意,不是编译错误。这是运行时错误。那是因为你做了演员(显式演员!),所以基本上你告诉编译器信任你知道你做了什么,但是......你没有。所以编译器会说“好的,我会编译,他知道他在做什么”,但是当你运行程序时,你会得到运行时错误。
(如果你删除了强制转换,你确实会收到编译错误。)
答案 2 :(得分:1)
这是因为您正在尝试将Super Class对象强制转换为Sub Class。
Hotspot h = new Hotspot(31.124, 43.123, "name", "comment", "point of interest");
HotspotProxy hp = (HotspotProxy)h;
你在第二个语句中做了类型强制,并且认为编译器认为h
确实是HotspotProxy
个对象。编译器允许这样做,因为Hotspot h
可以引用其子类的任何对象。因此,如果前一行是Hotspot h = new HotspotProxy()
,则此转换将成功。但在运行时,JVM发现您违反了编译器的信任,h
是Hotspot
的对象,而不是HotspotProxy
因此它会抛出异常。
答案 3 :(得分:1)
有时,对象变量实际上是变量所在子类的实例。例如,你可以有
Hotspot h = new HotspotProxy(...)
因为HotspotProxy
是Hotspot
。在那种情况下,布尔(h instanceof HotspotProxy)
将是true
。但是,在您的情况下,h
变量为Hotspot
,因此(h instanceof HotspotProxy)
将为false
并且广告投放失败。
答案 4 :(得分:0)
首先检查HotSpot是否是hostspotproxy的实例
if(h instanceof HotspotProxy)
HotspotProxy hp = (HotspotProxy)h;
答案 5 :(得分:0)
如果您使用的引用变量实际指向子类对象,则可以向下转换。 例如,假设类Dog扩展了类Animal。
然后
Animal a = new Dog();
Animal b = new Animal();
Dog d1=(Dog)a; //this works
Dog d2=(Dog)b; //this fails at run time
当我们以这种方式进行转换时,编译器将信任我们:它确保对象属于同一继承层次结构。所以这将编译好。但是在第二种情况下,以及在你的情况下,这会抛出ClassCastException。
您可以在向下转发之前检查您的代码,以防止出现此类错误:
if(HotSpot1 instanceof HotSpotProxy)
{
HotSpotProxy hsp= (HotSpotProxy) HotSpot1;
}