【问题标题】:Generics Type casting?泛型类型转换?
【发布时间】:2012-11-28 15:03:48
【问题描述】:

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

getJavaObj() 是一个接受Long empId 并返回Map<String, ? extends BaseEntity> 的方法

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

我试图在它提供的主类中使用泛型;

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

它给出了这个错误类型安全:Unchecked cast from Map&lt;String,capture#1-of ? extends BaseEntity&gt; to Map

当我像这样进行类型转换时

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

它给出了这个警告

类型安全:未经检查从Map&lt;String,capture#1-of ? extends Serializable&gt; 转换为 地图 类型安全:未经检查从Map&lt;String,capture#1-of ? extends BaseEntity&gt; 转换为 地图

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

【问题讨论】:

    标签: java generics abstract-factory


    【解决方案1】:

    重新定义你的工厂方法:

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

    然后你可以在没有强制转换的情况下获得正确的类型:

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

    【讨论】:

    • 难道他们不能简单地将泛型类型 arg 添加到方法而不是类参数吗?如public abstract &lt;T&gt; Map&lt;String, T extends BaseEntity&gt; getJavaObj(Long id)?还是我忘记了关于泛型方法 args 的重要内容?
    • @TomG - 这也可以。我假设 T 已经是一个类参数。将其作为答案发布,它可能会得到一个绿色的复选标记。 :)
    • @TedHopp 在抽象类中,它不允许你建议。它给出错误并建议:此行有多个标记 - 类型参数字符串隐藏类型字符串 - 此方法需要正文而不是分号 - 缺少该方法的返回类型 - 令牌“扩展”上的语法错误,预期
    • @silver_mist - 是的,我的语法有点搞砸了。我已经编辑了建议的代码。这至少为我编译。
    • @TedHopp 在我尝试在 getJavaObj() 中创建员工对象时实现该方法时,会出现编译错误“无法实例化员工类型”。为什么会这样?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多