【问题标题】:How to bind a generic parameter to a specific List subclass?如何将泛型参数绑定到特定的 List 子类?
【发布时间】:2013-09-17 19:53:08
【问题描述】:

我希望在下面的代码中:

public static <K, D extends List<T>, T> List<Map<K, D>> meth(K k, D d) {
    List<Map<K, D>> daBytes = (List<Map<K, D>>)
            new ArrayList<Map<K, List<List<Byte>>>>();
    // ...
}

编译器找出DList&lt;List&lt;Byte&gt;&gt; 和/或T&lt;List&lt;Byte&gt; - 并真正摆脱演员表。相反,我得到:

Cannot cast from ArrayList&lt;Map&lt;K,List&lt;List&lt;Byte&gt;&gt;&gt;&gt; to List&lt;Map&lt;K,D&gt;&gt;

无论如何我都需要演员阵容。
为什么 ?我想要的东西是否可能(没有strategy pattern 解决方法)?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    Dmeth调用者指定;你不能强迫它成为meth 中的其他特定类型。如果D 是指List&lt;List&lt;Byte&gt;&gt;,那么你应该这样写:

    List<Map<K, List<List<Byte>>>> daBytes = new ArrayList<Map<K, List<List<Byte>>>>();
    

    如果你的意思是D 是任意的,那么你应该写

    List<Map<K, D>> daBytes = new ArrayList<Map<K, D>>();
    

    【讨论】:

    • 我明白了 - D 可以是 List&lt;List&lt;Byte&gt;&gt;List&lt;Byte&gt; - 请参阅代码 here。所以我知道它必须是一些东西的列表 - ? 没有用,因为它不能被操纵,无论如何我需要将它分配给特定的类型。无论如何,我可以做我想做的事(问题 2)?
    • 不,你不能像那样做你想做的事。不过,您可以使用ArrayList&lt;Map&lt;K, List&lt;T&gt;&gt;,但不能将T 限制为ByteList&lt;Byte&gt;
    • 显然我不是唯一一个考虑这个功能的人:github.com/functionaljava/functionaljava/blob/master/core/src/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多