无法在Java中扩展类

时间:2013-06-09 17:04:49

标签: java classcastexception extends

我感到愚蠢地问这个问题,但我真的没有看到问题。编译它给了我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;

请告诉我哪里失败了。感谢任何suggention

6 个答案:

答案 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发现您违反了编译器的信任,hHotspot的对象,而不是HotspotProxy因此它会抛出异常。

答案 3 :(得分:1)

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

Hotspot h = new HotspotProxy(...)

因为HotspotProxyHotspot。在那种情况下,布尔(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;
}