什么是原始类型,为什么我们不应该使用它呢?| Java Debug 笔记

258 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

什么是原始类型,为什么我们不应该使用它呢?

Java中的原始类型是什么,为什么我经常听到不应该在新代码中使用它们的信息?
如果我们不能使用原始类型,那有什么选择呢?有什么更好的选择?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

Java中的原始类型是什么,为什么我经常听到不应该在新代码中使用它们的信息?

原始类型是Java语言的古老历史。在开始的时候Collections,他们Objects一无所有,一无所有。对Collections所需的强制转换的每个操作都从Object转换为所需的类型。

List aList = new ArrayList();
String s = "Hello World!";
aList.add(s);
String c = (String)aList.get(0);

尽管大多数情况下都可行,但确实发生了错误

List aNumberList = new ArrayList();
String one = "1";//Number one
aNumberList.add(one);
Integer iOne = (Integer)aNumberList.get(0);//Insert ClassCastException here

旧的无类型集合不能强制类型安全,因此程序员必须记住他存储在集合中的内容。 为了克服这种局限性而发明的泛型,开发人员只需声明一次存储的类型,然后由编译器执行即可。

List<String> aNumberList = new ArrayList<String>();
aNumberList.add("one");
Integer iOne = aNumberList.get(0);//Compile time error
String sOne = aNumberList.get(0);//works fine

为了比较:

// Old style collections now known as raw types
List aList = new ArrayList(); //Could contain anything
// New style collections with Generics
List<String> aList = new ArrayList<String>(); //Contains only Strings

比较接口比较复杂:

//raw, not type save can compare with Other classes
class MyCompareAble implements CompareAble
{
   int id;
   public int compareTo(Object other)
   {return this.id - ((MyCompareAble)other).id;}
}
//Generic
class MyCompareAble implements CompareAble<MyCompareAble>
{
   int id;
   public int compareTo(MyCompareAble other)
   {return this.id - other.id;}
}

注意,不可能用原始类型实现CompareAble接口compareTo(MyCompareAble)。为什么不应该使用它们:

Object存储在中的任何内容Collection都必须先进行转换,然后才能使用
使用泛型可以进行编译时检查
使用原始类型与将每个值存储为 Object

编译器的工作:泛型是向后兼容的,它们使用与原始类型相同的Java类。魔术主要发生在编译时。

List<String> someStrings = new ArrayList<String>();
someStrings.add("one");
String one = someStrings.get(0);

将被编译为:

List someStrings = new ArrayList();
someStrings.add("one"); 
String one = (String)someStrings.get(0);

如果直接使用原始类型,则这与您编写的代码相同。以为我不确定该CompareAble接口会发生什么,我想它会创建两个compareTo函数,一个函数采用a,另一个函数MyCompareAble采用anObject并将其在转换后传递给第一个函数。

原始类型的替代方法是什么:使用泛型

文章翻译自kgs4h5t57thfb6iyuz6dqtun5y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/2…

作者建议:使用泛型吧,方便扩展

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️