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

标签 java generics type-erasure

考虑以下 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/

相关文章:

java - 解析InputStream "on the fly"/重用InputStream

java - 将 protobuf-net 与 WCF 客户端和 Java 服务器一起使用

通用基类具体实现的c#工厂

java - 在运行时访问参数化类型信息

c++ - 类型删除工作或失败取决于优化级别

java - 如何在java中检索对象类型的OUT参数的数据

java - 泛型和 Play 框架

java - 如何根据 ChildType 对 java.util.ArrayList<ParentType> 进行排序?

Java Generics::未能提供类型安全?

java - 方法重载中奇怪的 Java null 行为