我想创建一个采用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
必须保持原样。
如何将它们纳入通用的应用方法?
答案 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>>
,例如,这会破坏类型安全。