gpt4 book ai didi

java - Java泛型中的捕获能否统一在类型声明中?

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:33 27 4
gpt4 key购买 nike

考虑以下 Java 函数:

public void foo(Class<? extends Exception> cl, List<? extends Exception> ls) throws Exception {
ls.add(cl.newInstance());
}

这不起作用,因为类型捕获了 clls不是统一的,实际上可以指代不同的类型。如果编译了这个函数,我可以将它命名为 foo(NullPointerException.class, new List<SecurityException>()) ,这将是非法的。

显然,我们可以通过统一类型捕获来解决这个问题,如下所示:

public <T extends Exception> void foo(Class<T> cl, List<T> ls) throws Exception {
ls.add(cl.newInstance());
}

现在这个函数按预期工作了。因此,回到我的问题:有没有办法在单个类型声明中统一类型捕获?

例如,我经常发现自己想要一个将类映射到自身实例的映射。我目前能想到的唯一方法是有一个附带的函数来执行未经检查的转换:

private Map<Class<? extends Foo>, ? extends Foo> map = ...;
@SuppressWarnings("unchecked")
private <T extends Foo> T getFoo(Class<T> cl) {
return((T)map.get(cl));
}

但显然更好的做法是不必抑制警告,只让编译器理解映射类型声明中的两个类型捕获应该相同,然后只公开映射。例如,如果我可以有一个类似这样的声明:

<T extends Foo> Map<Class<T>, T> map = ...;

显然,这不是有效的语法,但我的问题归结为:是否有任何有效的语法可以让我做一些达到那种效果的事情?

最佳答案

您正在寻找Generics of a Higher Kind . Java 没有,而且可能永远不会。我知道这是一个 Java 问题,但我会指出 Scala有更高的种类。如果您想了解在类型系统中拥有如此强大的功能意味着什么,您可能想尝试一下。

关于java - Java泛型中的捕获能否统一在类型声明中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201704/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com