为什么不';Java泛型是否支持基元类型?

为什么不';Java泛型是否支持基元类型?,java,generics,primitive,Java,Generics,Primitive,为什么Java中的泛型与类一起工作,而不与基元类型一起工作 例如,这很好: List<Integer> foo = new ArrayList<Integer>(); List foo=new ArrayList(); 但这是不允许的: List<int> bar = new ArrayList<int>(); 列表栏=新建ArrayList(); Java中的泛型完全是编译时构造—编译器将所有泛型使用转换为正确类型的类型转换。这是为了与以前

为什么Java中的泛型与类一起工作,而不与基元类型一起工作

例如,这很好:

List<Integer> foo = new ArrayList<Integer>();
List foo=new ArrayList();
但这是不允许的:

List<int> bar = new ArrayList<int>();
列表栏=新建ArrayList();

Java中的泛型完全是编译时构造—编译器将所有泛型使用转换为正确类型的类型转换。这是为了与以前的JVM运行时保持向后兼容性

这:


因此,任何用作泛型的对象都必须可转换为对象(在本例中,
get(0)
返回一个
对象
),而基元类型则不是。所以它们不能用在泛型中。

在Java中,泛型的工作方式与它们一样。。。至少在一定程度上。。。因为它们是在语言设计多年后添加到语言中的1。语言设计者在泛型的选择上受到限制,他们必须提出一种向后兼容现有语言和Java类库的设计

其他编程语言(例如C++、C**、艾达)确实允许基元类型用作泛型的参数类型。但这样做的另一面是,此类语言的泛型(或模板类型)实现通常需要为每个类型参数化生成泛型类型的不同副本



1-Java 1.0中没有包含泛型的原因是时间压力。他们觉得必须尽快发布Java语言,以填补web浏览器带来的新的市场机会。James Gosling曾表示,如果他们有时间的话,他希望包括泛型药物。如果发生这种情况,Java语言会是什么样子是任何人的猜测。

集合被定义为需要一个派生自
Java.lang.Object
的类型。基本类型根本不这样做。

根据,泛型类型变量只能用引用类型实例化,不能用基元类型实例化

这应该是Java10下的版本

在报纸上

关于原语不支持泛型的原因,存在一个问题。而且,在Java的未来版本中

Java当前的擦除实现,它为所有引用实例化生成一个类,不支持原语实例化。(这是一种同构翻译,Java的泛型只能覆盖引用类型的限制来自于同构翻译对JVM字节码集的限制,后者使用不同的字节码对引用类型和基元类型进行操作。)但是,Java中已擦除的泛型提供了行为参数(泛型方法)和数据参数(泛型类型的原始和通配符实例化)

选择了同构翻译策略,当泛型类型变量被合并到字节码中时,它们被擦除到它们的边界。这意味着,无论类是否为泛型,它仍然编译为一个具有相同名称且其成员签名相同的类。类型安全性在编译时进行验证,运行时不受泛型类型系统的限制。反过来,这又限制了泛型只能处理引用类型,因为对象是可用的最通用的类型,并且它不扩展到基元类型


在java中,泛型是通过使用“类型擦除”实现向后兼容性的。 所有泛型类型都在运行时转换为对象。 比如说,

public class Container<T> {

    private T data;

    public T getData() {
        return data;
    }
}
编译器负责提供适当的强制转换以确保类型安全

Container<Integer> val = new Container<Integer>();
Integer data = val.getData()
现在的问题是为什么在运行时选择“Object”作为类型?

答案是对象是所有对象的超类,可以表示任何对象 用户定义的对象

由于所有原语都不是从“对象”继承的,因此我们不能使用它 作为泛型类型


<强> FY:瓦尔哈拉项目正试图解决上述问题。>/P>@ DayalayTekin——实际上java java并没有像C++模板那样处理…为什么Java编译器在使用前还不能把原语类型打包呢?这应该是可能的,对吧?@vrwim-这可能是可能的。但这只是语法上的糖分。真正的问题是,与C++ +C模型相比,带装箱的原语的java泛型在时间和空间上都相对昂贵。实际使用的原始类型。@Maughanra是的,我知道我可以:)我坚持我的观点,这是一个糟糕的设计。希望它能在Java10(或者我听说的那样)和高阶函数中得到修复。不要引用我的话。@Ced完全同意这是一个糟糕的设计,它会对初学者和专业人士造成无休止的伤害。alikeI认为这里的问题是“为什么”。为什么泛型需要对象?人们的共识似乎是,它不是一种设计选择,而是更倾向于向后兼容。在我看来,如果泛型不能处理原语,那就是功能缺陷。目前,涉及原语的所有内容都必须为每个原语编写:我们使用Integer.compare(int a,int b)、Byte.compare(Byte a,Byte b)等,而不是Comparator。这不是解决方案!是的,泛型比基元类型更重要是必须具备的功能。这里有一个链接,指向it提案int i=(int)new Object();不过编译得很好。加上1表示正确的命名法。谢谢你的回答。由于我不知道Java的旧版本是如何工作的,您能否举一个例子,说明如果原语由泛型支持,它将如何破坏一些旧代码?

public class Container<T> {

    private T data;

    public T getData() {
        return data;
    }
}
public class Container {

    private Object data;

    public Object getData() {
        return data;
    }
}
Container<Integer> val = new Container<Integer>();
Integer data = val.getData()
Container val = new Container();
Integer data = (Integer) val.getData()