【问题标题】:dynamic binding with generic type与泛型类型的动态绑定
【发布时间】:2011-02-02 13:19:03
【问题描述】:

我需要动态绑定一个参数类型(列表),但我没有正确... 这是我的课程的概述:

public abstract interface SettingsField<A> extends Window

然后我有一些实现 SettingsField 的类:

public class StringSettingsField implements SettingsField<String>
public class MapSettingsField<K, V> implements SettingsField<Map<K, V>>

第一个非常简单,但例如第二个有点棘手......所以我想创建一个返回 SettingsFileds 的工厂。我想使用动态绑定为我要放入的每个对象获取正确的 SettingsWindow。 所以我重载了以下方法getField。 对于 String 来说很简单:

public SettingsField<String> getField(String x){
    return new StringSettingsField();
}

但是对于地图我有一些麻烦......

public SettingsField<Map<? extends String, ?>> getField(Map<? extends String, ?> x){
    return new MapSettingsField();
}

键始终是字符串是一个例子(也可以是?) 但是现在编译器给了我警告

MapSettingsField 是原始类型。对泛型 MapSettingsField 的引用应该被参数化

但是我怎么能在这里做到这一点?问题只是使用 Map 无效,因为 java 中的 f-generic 存在一些问题(即使 B 是 A 的子类型,List 也不是 List 的隐式子类型)

有什么提示吗?提前致谢!

【问题讨论】:

    标签: java generics dynamic-binding


    【解决方案1】:

    IIUYC,你需要

    return new MapSettingsField<? extends String, ?>();
    

    顺便说一句,extends String 没有多大意义,因为 String 是最终的。

    但是,我会选择类似的东西

    public <K, V> SettingsField<Map<K, V>> getField(Map<K, V> x){
        return new MapSettingsField<K, V>();
    }
    

    您也可以将 K 声明为有界,例如

    public <K extends Number, V extends List> ...
    

    或其他。

    【讨论】:

    • 第一个示例给出了编译时错误,因为 MapSettingsField 类型的参数数量不正确;它不能用参数 >
    • 我认为您的第二个解决方案似乎是最好的,因为我有静态类型安全!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2013-05-15
    • 2019-12-07
    相关资源
    最近更新 更多