【问题标题】:Java Generics: create a general method operating on parent classesJava 泛型:创建对父类进行操作的通用方法
【发布时间】:2015-03-17 18:04:49
【问题描述】:

有如下结构

我自己的课程

class HERMEntityRelationshipType
class HERMEntityType extends HERMEntityRelationshipType 
class HERMRelationshipType extends HERMEntityRelationshipType

从框架生成的类。

class DBMEntityRelationshipType extends DBMDataObject
class DBMEntityType extends DBMDataObject
class DBMRelationshipType extends DBMDataObject

我写了两个类似的方法。

private HERMEntityType parseERType(DBMEntityType dbmEntityType) {...}
private HERMRelationshipType parseERType(DBMRelationshipType dbmRelationshipType){...}

但我只想有这样一种方法:

HERMEntityRelationshipType parseERType(DBMEntityRelationshipType dbmERType){...}

但在调用该通用方法后,我无法将我的类转换为子类:例如HERMEntityRelationshipTypeHERMEntityType。但是将DBMDataObject 转换为DBMEntityRelationshipType 效果很好。所以他们必须比我更聪明地实现这些类。我的演员表如下所示:

HERMEntityType entityType = (HERMEntityType) parseERType((DBMEntityRelationshipType) dataobject);

结果为:Exception in thread "main" java.lang.ClassCastException: hermtransformation.herm.HERMEntityRelationshipType cannot be cast to hermtransformation.herm.HERMEntityType

那么将我的超类转换为子类需要什么?

【问题讨论】:

    标签: java oop generics inheritance


    【解决方案1】:

    这里的问题是Java 不允许向下转换。您应该创建子类的新对象,而不是返回父类的新对象。

    parseERType 方法应该如下所示:

    HERMEntityRelationshipType parseERType(DBMEntityRelationshipType   dbmERType){
        if(dbmERType.getClass().equals(DBMEntityType.class)) {
            return new HERMEntityType(dbmERType);
        } else {
            return new HERMRelationshipType(dbmERType);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      DBMEntityRelationshipType 和 HERMEntityType 之间似乎没有关系。根据您的输入模型,缺少 DBMDataObject 和 HERMEntityRelationshipType 之间的关系。理想情况下,如果 DBMEntityRelationshipType 也从 HERMEntityRelationshipType 扩展,那么此转换将起作用。此外,您需要将项目多态性转换为父引用。

      【讨论】:

      • 它们之间应该没有关系。我一步一步地改造它们。我需要投 HERMEntityRelationshipType -> HERMRelationshipTypeHERMEntityRelationshipType -> HERMEntityType
      猜你喜欢
      • 1970-01-01
      • 2021-06-07
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多