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

通用型铸造?

上官华池
2023-03-14

在抽象工厂模式中,我使用泛型。我有一个扩展Serializable的BaseEntity接口,Employee类实现了BaseEntity。在抽象类中,我有一个getJavaObj方法

getJavaObj()是一种方法,它接受Long empId并返回映射

public abstract Map<String, ? extends BaseEntity> getJavaObj(Long id);

使用泛型,我试图在它给出的主类中做到这一点;

Map<String, Employee> emp = getJavaObj(empId);

它给出了这个错误类型安全:未检查的转换从Map

当我像这样做类型铸造

Map<String, Employee> emp = (Map<String, Employee>)getJavaObj(empId);

它给出了这个警告

类型安全:未选中从Map强制转换

有没有办法避免类型转换或解决即使在类型转换之后的警告?因为我返回的对象确实通过BaseEntity接口扩展到了Serializable。


共有1个答案

盖锐进
2023-03-14

重新定义您的工厂方法

public abstract <T extends BaseEntity> Map<String, T> getJavaObj(Long id);

然后你可以得到正确的类型回来,而不需要铸造:

Map<String, Employee> emp = getJavaObj(empId);
 类似资料:
  • 我对Java非常陌生,尤其是编写泛型代码。我的任务是编写泛型函数,返回ResultSet对象的ID列的值。 父类有整数ID,子类有字符串ID(我知道有字符串ID很少见,但数据很具体) 所以在父类中,我最终得到了函数: 在子类中,我有一个覆盖父类的方法: 当我需要调用这个函数时,我只需要: 我的问题是,如果做双重铸造(T)((长) 可以吗?有没有更简单的方法来实现这个功能,我不知道?

  • 我是从C++模板编程来的,有时会对泛型感到很困惑。由于没有方法专门化,我尝试使用了强制转换。以下是我的资料: 这不编译。 有什么办法可以让我做这个演员吗? 我想这样做的原因是:在C++模板中,我会为所支持的类型进行专门化,并创建一个抛出异常的非专门化版本。 其基本思想是:具有泛型方法的非泛型接口。尝试使用正确的类型获取值应该有效,尝试使用错误的类型则可能引发。 我们应该保持类型安全,所以我需要返回

  • 我对Java中的原语类型有一个问题。我使用的是JDK1.6。 如果我有以下信息: 编译器不想编译——它说它“无法从int转换为short”,并建议我转换为,因此: 真的管用。但我的问题是,我为什么要投?a和b的值在-短值范围为{-32768,32767}的范围内。当我想执行操作时,我还需要强制转换-,*,/(我还没有检查其他操作)。 如果我对基元类型执行相同的操作,我不需要将aa bb强制转换为。

  • 我正在尝试创建一个简单的国际象棋程序,我遇到了一个小问题,当执行典当推广。我有一个抽象的类片和6个类(国王,皇后,鲁克,骑士,主教和卒)扩展它。所以当一个棋子到达棋盘的另一端时,我想让他变成皇后。 我想知道是否有更好的方法来做这件事。以某种方式从“内部”更改对象的类。

  • 我对SSIS非常陌生,我有现有的SQL表,我想将数据加载到十进制(10,2)列中,但是.csv文件作为源文件包含值,因此我试图使用派生列和表达式将值替换为 我已将平面文件源输出-输出列更改为 派生列输出-Columns输出设置为 SSIS接受所有这些,但在为派生列运行包时会出现错误,如下所示 [派生列[2]]错误:SSIS错误代码DTS_E_InsidedTransformFailureOnErr