当前位置: 首页 > 知识库问答 >
问题:

ClassCastException不能将Class.Accomodation转换为Class.Auttraction

能修谨
2023-03-14

这些是我的蒙德尔人:

public class Accomodation {
    ...
}

而且

public class Attraction extends Accomodation {
    ... 
    private String openingTime;
}

我的Controller类中有这个方法:

protected Accomodation getAccomodationByFormData(CrudView crudView) {
        Accomodation accomodation = new Accomodation();
        // setters
        return accomodation;
    }

attractioncontroller(扩展以前的controller)中使用:

@Override
    protected Accomodation getAccomodationByFormData(CrudView crudView) {
        Attraction attraction = (Attraction) super.getAccomodationByFormData(crudAttractionView);
        attraction.setOpeningTime(getOpeningTimeWithFormData()); 
        return attraction;
    }

在此attractioncontroller的另一点中,我有:

...
Attraction attraction = (Attraction) getAccomodationByFormData(crudAttractionView); // throws ClassCastException
...

但这给了我:

线程“JavaFX Application thread”java.lang.ClassCastException:类Models.Accomodation不能强制转换为类Models.Intraction(Models.Accomodation和Models.Intraction在Controllers.CrudattractionController.GetAccomodationByFormData(CrudattractionController.java:302)在Controllers.CrudattractionController.lambda$ButtonConferMacLicked$4(CrudattractionController.java:143)在un.javafx.event.EventDispatchChainImpl.DispatchEvent(EventDispatchChainImpl.java:114)在javafx.base/com.sun.javafx.event.base/com.sun.javafx.event.dispatchEvent(BasicEventDispatchChainImpl.java:56)在javafx.base/com.sun.javafx.event.dispatchEvent(BasicEventDispatchChainImpl.dispatchEvent(trol.inputmap.inputmap.handle(inputmap.java:274)在javafx.base/com.sun.javafx.event.compositeEventHandler$normalEventHandlerRecord.handleBubblingEvent(compositeEventHandler.java:218)在javafx.base/com.sun.javafx.event.compositeEventHandler.dispatchBubblingEvent(compositeEventHandler.java:80)在tchEvent(EventDispatchChainImpl.java:114)在javafx.base/com.sun.javafx.event.basicEventDispatchEvent(BasicEventDispatchChainImpl.dispatchEvent(BasicEventDispatchChainImpl.java:56)在javafx.base/com.sun.javafx.event.event.dispatchEvent(EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)在java.base/java.security.accesscontroller.doprivileged(本机方法)javafx.graphics/com.sun.javafx.tk.quantum.glassvieweventhandler.lambda$HandleMoseEvent$2(Glassvieweventhandler.java:434)javafx.graphics/com.sun.javafx.tk.quantum.quantumtoolkit.runwithoutrenderlock(quantumtoolkit.java:390)

(ps.请注意,CrudattractionView类扩展了CrudView)

  • 如何修复?

编辑

吸引力

public class Attraction extends Accomodation {
    private String openingTime;

    public Attraction() {

    }

    public Attraction(Accomodation accomodation) {
        super(accomodation);
    }

    // getters and setters
}

住宿

public class Accomodation implements Serializable {
    protected String id;
    protected String name;
    protected Integer avarageRating;
    protected Integer avaragePrice;
    protected String phoneNumber;
    protected Address address;
    protected Point point;
    protected List<Review> reviews;
    protected Long totalReviews;
    protected Long totalRating;
    protected List<String> images;
    protected boolean hasCertificateOfExcellence;
    protected String addedDate;
    protected String lastModificationDate;

    public Accomodation() {

    }

    public Accomodation(Accomodation accomodation) {
    }

    // getters and setters
}

共有1个答案

秦安怡
2023-03-14

所有吸引都是住宿,但不是所有住宿都是吸引

这意味着您不能安全地执行以下操作:

Attraction attraction = (Attraction) super.getAccomodationByFormData(crudAttractionView);

即使您在attractioncontroller中(Java不会根据您的控制器名称更改super.getaccomadation的返回类型)。

一种不需要任何框架的解决方案是:

Accomodation accomodation = super.getAccomodationByFormData(crudAttractionView);
Attraction attraction = new Attraction(accomodation);
attraction.setOpeningTime(getOpeningTimeWithFormData())

您只需确保您有一个accomodation构造函数,它将接受accomodation并将其字段复制到您的景点。

类似于:

public Attraction(Accomodation accomodation){
  attraction.setX(accomodation.getX())
  ...
}

或者只调用super(accomodation)并在accomodation中使用一个构造函数,该构造函数将能够将一个accomodation复制到一个新的accomodation中(这样您就可以在以后的所有扩展类中使用该构造函数)

现在,你确保你的住所是一个有效的吸引力,然后你投下它。

在一个更简洁的示例中,下面是它的外观

import java.io.Serializable;

class Attraction extends Accomodation {

    public Attraction() {

    }

    public Attraction(Accomodation accomodation) {
        super(accomodation); // we let super do the simple mapping
    }

    // getters and setters

    public void setOpeningTime(String test){
        //

    }
    protected Accomodation getAccomodationByFormData() {
        Accomodation accomodation= new Accomodation();//super.getAccomodationByFormData(crudAttractionView);
        Attraction attraction = new Attraction(accomodation); // we convert our accomodation thanks to our constructor
        attraction.setOpeningTime("...");
        return attraction;
    }
}

class Accomodation implements Serializable {
    protected String id;
    protected String name;
    protected Integer avarageRating;
    protected Integer avaragePrice;
    protected String phoneNumber;
    protected Long totalReviews;
    protected Long totalRating;
    protected boolean hasCertificateOfExcellence;
    protected String addedDate;
    protected String lastModificationDate;

    public Accomodation(Accomodation accomodation) {
        this.id = accomodation.id;
        this.name = accomodation.name;
        this.avarageRating = accomodation.avarageRating;
        this.avaragePrice = accomodation.avaragePrice;
        this.phoneNumber = accomodation.phoneNumber;
        this.totalReviews = accomodation.totalReviews;
        this.totalRating = accomodation.totalRating;
        this.hasCertificateOfExcellence = accomodation.hasCertificateOfExcellence;
        this.addedDate = accomodation.addedDate;
        this.lastModificationDate = accomodation.lastModificationDate;
    }

    public Accomodation() {

    }

    // getters and setters
}
 类似资料:
  • 我的代码有一个错误。 我的适配器类: 我的班级:

  • 问题内容: 连接到MySQL时,出现错误(见下文)。 点击此处获取代码 我得到以下输出: 我该如何解决? 问题答案: 您的错误明确指出无法进行强制转换,因为java.math.BigInteger类实例不是java.lang.Long类的实例。 现在出现了一个问题,即谁在哪个级别上进行强制转换,当我们要求JDBC驱动程序进行连接时,它实际上在幕后进行了大量工作,然后才真正给我们适当的连接工作对象。

  • 请帮我把这个移开。下面是我的代码: 这是我从php文件中得到的json

  • 问题内容: 我知道在stackoverflow中已经对此提出了很多要求,但是我找不到适合我问题的答案。 在下面的以下代码中,我无法打印出每个项目,因为它说。 我曾尝试使用来打印每个项目,但都无法正常工作。 我认为可能是由于Edge类中的方法导致的问题,但是如果我不使用它,我将无法获得真实的键号(它将被打印为或类似的形式) 感谢您之前的帮助 主班 边缘类 图类 节点类 问题答案: private H

  • 问题内容: 我使用maven-eclipse创建了一个新的Spring MVC项目,并引发以下错误: (我尝试了stackoverflow的一些解决方案,但这些解决方案在我的情况下不起作用。pom.xml出现了一些我找不到的问题。我为servlet- api添加了提供的作用域,并尝试了它也不起作用。) 我的pom.xml如下: 我的web.xml如下: 问题答案: 更改 至 具有以下说明: 这很像

  • 问题内容: 您好,我的代码正在抛出。StackTrace显示: 即@ ps.setDate(6,(Date)affiliate.getDate()); 在DAO 以下是我的servlet: 以下是我的DAO: 以下是我的DTO: 请在这方面帮助我 问题答案: 由于文档说,将在参数的需要类型的Date对象。但是您似乎在课堂上使用了对象。 这就是为什么你得到了。 要解决此问题,您需要将类中的对象类型更