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

用于抽象类和动态强制转换的多个子类型的通用接口

储思聪
2023-03-14

我有一个可以简化如下的场景:

    我有一个名为AbstractField的抽象类 < li >可以有许多从此类扩展的类:CurrencyField、DecimalField等。 < li >现在我有一个通用接口FieldDBStore来创建或更新数据库中的字段详细信息。 < li >我想为每种类型的字段实现上述接口(每当它以不同方式存储时)。

以下是一些代码示例:

对于抽象字段

/* AbstractField */
public abstract class AbstractField {
    //private members
    // builder
}

对于货币字段

public class CurrencyField extends AbstractField {
    //private members
    // builder that is extended from parent class's builder
}

对于FieldDBStore

interface FieldDBStore<T extends AbstractField> {
    
    void createField(T field, String tableName, String columnName);
    
    void updateField(T field);
}

CurrencyFieldDBStore

public class CurrencyFieldDBStore implements FieldDBStore<CurrencyField> {
    @Override
    public void createField(CurrencyField field, String tableName, String columnName) {
        // Some operations
        
    }

    @Override
    public void updateField(CurrencyField field) {
        // Some operations
        
    }
}

现在的问题是:每当客户机试图发送一个要创建/更新的字段时,它都不知道字段的类型。因此,它将把字段作为超类型(AbstractField)发送。这导致了以下在eclipse中可见的错误

public AbstractField createAbstractField(AbstractField field, Long userId) { 
    //FieldType is an enum that can return appropriate DBStore implementation as per the field type
    FieldType type = field.getFieldType();
    String tableName = "SomeTableName";
    String columnName = "SomeColumnName";
    type.getFieldDBStore().createField(field, tableName, columnName);

在上面的代码中,最后一行抛出此错误

FieldDBStore类型中的方法createField(捕获#2-of?扩展AbstractField,String,String)

我尝试实现一个抽象的字段数据库存储,然后扩展它,但它并没有解决问题。任何建议将不胜感激

共有1个答案

栾烨华
2023-03-14

<code>键入.getFieldDBStore()。createField()尝试调用具有特定类型的方法。例如,<code>CurrencyField</code>,但<code>AbstractField>/code<不是<code>CurrencyField。

这应该是矛盾的。

因此,在这种情况下,您需要使用一个上限。例如

<代码>无效

说明:此方法排除了作为AbstractField子类型的每个类型,包括AbstractField

 类似资料:
  • 本文向大家介绍C#中的自动类型转换和强制类型转换,包括了C#中的自动类型转换和强制类型转换的使用技巧和注意事项,需要的朋友参考一下 前面已经认识了不同的数据类型,你们有没有尝试过让不同的数据类型进行运算呢? 运行结果是:1 我们把一个整型的变量赋值给了一个浮点型的变量,可以正常的输出,如果我们把一个浮点型的变量赋值给一个整型的变量呢? 这样就会报错。 为什么呢?因为我们之前说过,变量就像一个容器,

  • 假设有一个具有属性a的抽象类A和三个非抽象子类B、C和D。B没有附加属性,C包含属性c,D包含属性c和d。 我想为抽象类A的子类StdDeserializer能够根据要反序列化的属性的存在来决定选择哪个子类。 我以前用Codehaus的一些Jackson版本做到了这一点,它使用以下实现运行良好: 这很好,但从FasterXML ObjectMapper迁移到Jackson 2.4后,不允许Obje

  • 强制类型转换 隐式类型转换:隐式类型转换又称为自动类型转换,隐式类型转换可分为三种:算术转换、赋值转换和输出转换。 显式类型转换:显式类型转换又称为强制类型转换,指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,这种类型转换可能会造成数据的精度丢失。 数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则

  • 当我点击我的颤振应用程序中的一个按钮时,我出现了一个错误。这里有人有解决方案吗?! 路线 争论 还有地图 完全错误 生成CategoryMalsScreen(脏,依赖项:[[U ModalScopeStatus],状态:[U CategoryMalsScreenState]时引发了以下错误:类型“String”不是类型“Map”的子类型 导致错误的相关小部件是:CategoryMalsScreen

  • 本文向大家介绍关于C++的强制类型转换浅析,包括了关于C++的强制类型转换浅析的使用技巧和注意事项,需要的朋友参考一下 前言 一说起强制类型转换大家都很熟悉,相信很多学习完C++的朋友还在使用C语言的强制类型的方式 (类型)变量. C++其实也具有自己的一套强制类型转换它们分明是:static_cast  reinterpret_cast  const_cast  dynamic_cast四种类型

  • Go 语言是一种强类型语言,而且没有隐式转换。也就是说运算符左右的变量类型必须一致,若不一致就会报错。为了使用户更加的容易使用,所以 Go 语言提供了各个类型之间强制类型转换的内置方法。 1. 整型和浮点型互相转换 整型和浮点型变量之间的相互转换相对容易,只需使用强制类型转换标志 type(variable)就好了。需要注意的是,当高精度向低精度类型转换的时候,会失真。即浮点型向整型转换的时候会失