为什么二级泛型在Java中是不可能的
长话短说: 为什么在Java中无法执行以下操作为什么二级泛型在Java中是不可能的,java,generics,Java,Generics,长话短说: 为什么在Java中无法执行以下操作 public class Test<A<B>> {} // A and B both being generic parameters. 我做了一个快速的搜索 那么为什么编译器不允许多级泛型? 允许有什么问题吗?这是限制吗?还是别的什么?让我们假设这个类实际上是在编译: public class Test<A<B>> { .. } 当发生类型擦除时,应替换为类,然而,由于擦除,我们只有一个类(即使
public class Test<A<B>> {} // A and B both being generic parameters.
我做了一个快速的搜索
那么为什么编译器不允许多级泛型?
允许有什么问题吗?这是限制吗?还是别的什么?让我们假设这个类实际上是在编译:
public class Test<A<B>> { .. }
当发生类型擦除时,
应替换为类
,然而,由于擦除,我们只有一个类
(即使在内部它将包含关于整数
类型的信息)-预期为类
,但提供一个类
应该是不正确的
谢谢你提出这个有趣的问题 Scala称之为更高级的类型。所以这绝对是一个可行的抽象。据我所知,将其添加到Java中从未被认真考虑过 遗憾的是,我找不到任何好的介绍Scala更高级类型的文章。我能找到的最好的是原稿;以下是它的摘要: 在Java5和C#2.0中,主流面向对象编程语言以泛型的名义引入了一阶参数多态性。尽管泛型的一阶变量非常有用,但它也施加了一些限制:可以对类型进行抽象,但生成的类型构造函数不能对类型进行抽象。这可能导致代码重复。通过允许类型构造函数作为类型参数和抽象类型成员,我们在Scala中消除了这个限制。本文介绍了生成的类型构造函数多态性的设计和实现。此外,我们还研究了该特性如何与现有的面向对象结构交互,并展示了它如何使语言更具表现力
胡乱猜测:这将使类型系统的规则过于复杂,甚至其作者也无法完全掌握。而且它的用处可能很小——正如您自己所注意到的,您没有提出任何用例。
public class Test<A<B>> { .. }
new Test<Class<Integer>>()
//or
new Test<List<String>>()
new Test<String>();
//or
new Test<Object>();
new Test<Class<Integer>>();