2

我觉得问这个问题很愚蠢,但我真的不明白这个问题。编译它给了我 ClassCastExeption

这是超级班

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;

请告诉我我失败的地方。感谢您的任何建议

4

6 回答 6

7
Hotspot      := Animal
HotspotProxy := Dog

您可以将 aDog转换为 an Animal(从特殊到一般,或者换句话说从子类到基类),但不能反过来(从一般到特殊,或者换句话说从基类到子类),因为everyDog是一个Animal,但是不是每个Animal都是Dog.

如果你有类似的东西

Animal a = new Dog();

那么,将允许以下情况:

Dog d = (Dog) a;

因为a实际上是一个Dog.

于 2013-06-09T17:06:57.043 回答
2

您不能将超类的实例强制 转换为子类

没错,HotspotProxy它也是一个Hotspot,但是..不是所有 Hotspot的 s 都是HotspotProxys。

请注意,这不是编译错误。这是一个运行时错误。那是因为你做了演员表(显式演员表!),所以基本上你告诉编译器相信你,你知道你在做什么,但是......你不知道。所以编译器会说“好的,我会编译,他知道他在做什么”,但是当你运行程序时,你会得到一个运行时错误。

(如果你删除演员表,你确实会得到一个编译错误)。

于 2013-06-09T17:07:19.363 回答
1

这是因为您试图将 Super Class 对象转换为 Sub Class。

Hotspot h = new Hotspot(31.124, 43.123, "name", "comment", "point of interest");
HotspotProxy hp = (HotspotProxy)h;

您在第二条语句中进行了类型强制,并愚弄了编译器,使其相信这h确实是一个HotspotProxyobject 。编译器允许这样做,因为Hotspot h可以引用其子类的任何对象。因此,如果上一行是Hotspot h = new HotspotProxy(),则此强制转换会成功。但是在运行时,JVM 发现您违反了编译器的信任并且h是 的对象Hotspot,而不是HotspotProxy,因此它会引发异常。

于 2013-06-09T17:08:39.690 回答
1

有时,对象变量实际上是变量的子类的实例。例如,你可以有

Hotspot h = new HotspotProxy(...)

因为 aHotspotProxyHotspot. 在那种情况下,布尔值(h instanceof HotspotProxy)将是true. 但是,在您的情况下,h变量会如此Hotspot,并且强制转换失败。(h instanceof HotspotProxy)false

于 2013-06-09T17:12:57.147 回答
0

首先检查 HotSpot 是否是 hostspotproxy 的实例

if(h instanceof HotspotProxy)
HotspotProxy hp = (HotspotProxy)h;
于 2013-06-09T17:16:57.350 回答
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;
}
于 2013-06-09T17:35:56.207 回答