如何在Map.Entry中使用通用方法参数?

时间:2018-02-01 10:38:35

标签: java generics

我想创建一个采用List Map.Entry的通用String的方法。密钥应始终为public void test() { List<Map.Entry<String, String>> strings; apply(strings); List<Map.Entry<String, Integer>> integers; apply(integers); } private void apply(List<Map.Entry<String, ?>> entry) { } private void apply(List<Map.Entry<String, Object>> entry) { } 类型,值可以是任何值。

然后我想提供如下条目:

apply()

但是:<String, String>方法都没有在这里工作。 旁注:我无法更改条目的类型。方法<String, Integer>virtualenv -p python3 ~/bleeding-edge-virtualenv source ~/bleeding-edge-virtualenv/bin/activate mkdir -p python/workspaces && cd python/workspaces wget https://bootstrap.pypa.io/get-pip.py -O ./get-pip.py python3 ./get-pip.py python3 --version pip 9.0.1 from /home/ekenny/bleeding-edge-virtualenv/lib/python3.4/site-packages (python 3.4) git clone https://github.com/explosion/spaCy cd spaCy pip3 download -m requirements.txt pip3 install -r requirements.txt python3 setup.py install deactivate 必须保持原样。

如何将它们纳入通用的应用方法?

2 个答案:

答案 0 :(得分:2)

使apply方法通用:

private <T> void apply(List<Map.Entry<String, T>> entry) {
}

请注意,根据您希望在apply正文中执行的操作,使用private void apply(List<? extends Map.Entry<String, ?>> entry)签名可能不够。

例如,如果您希望将列表中一个条目的值更改为另一个条目的值。

以下内容不会通过编译:

private void apply(List<? extends Map.Entry<String, ?>> entry) {
    entry.get(1).setValue (entry.get(0).getValue());
}

但这会:

private <T> void apply(List<Map.Entry<String,T>> entry) {
    entry.get(1).setValue (entry.get(0).getValue());
}

答案 1 :(得分:1)

OP's edit to the question之后,将其设为List<Map.Entry<String, Integer>>而不是Map.Entry<String, Integer> ...

将额外的界限添加到参数类型中:

private void apply(List<? extends Map.Entry<String, ?>> entry) {
                    //  ^-------^ here

这是必要的,因此编译器可以阻止您将Map.Entry<String, Integer>放入List<Map.Entry<String, String>>,例如,这会破坏类型安全。