Java 中 Map 和 Consumer 的多态性使用

问题描述 投票:0回答:1

我有这样的课

public class Foo {
    private final Map<Step, Consumer<Step>> context = new LinkedHashMap<>();
    
    public <T extends Step> void save(Consumer<T> consumer, T step) {
        this.context.put(step, consumer);
    }
}

如您所见,我希望能够在我的

Step
上下文中保存
Map
的子类,但出现以下错误

Provided Consumer<T>, Required Consumer<Step>

有什么方法可以通过使用泛型来达到预期的效果吗?

我试过的一些东西是:

  • Map
    类型更改为
    <? extends Step>
    ,但这会引发新的错误,因为当您使用通配符
    ?
    时,您似乎有一个只读的
    Map
    .
  • 如下所示的类型转换
public class Foo {
    private final Map<Step, Consumer<Step>> context = new LinkedHashMap<>();
    
    public <T extends Step> void save(Consumer<T> consumer, T step) {
        this.context.put(step, (Consumer<Step>) consumer);
    }
}

后者似乎有效,但我在控制台上收到

Unchecked cast
警告。如果这是要走的路,我想知道它的缺点是什么以及检查它的合适方法是什么。

java generics casting typechecking consumer
1个回答
1
投票

编译器无法确认作为 Map 键的 Step 的子类型与 Map 中键值的 Consumer same 子类型。

知道,所以知道未经检查的演员表是安全的。

与未经检查的演员一起去。

© www.soinside.com 2019 - 2024. All rights reserved.