【问题标题】:Is Arraylist is typesafe or strongly typed?Arraylist 是类型安全的还是强类型的?
【发布时间】:2013-08-01 19:29:13
【问题描述】:

我不知道“强类型”和“类型安全”到底有什么区别!

您能用简单的语言澄清一下吗?

假设我们使用的是 Arraylist,但我无法断定它是类型安全的还是强类型的。或者我们可以同时使用它吗?

【问题讨论】:

  • 请注意,“强类型”通常适用于编程语言,而“类型安全”可能来自“类型安全集合”短语...

标签: .net arraylist strong-typing typesafe


【解决方案1】:

ArrayList 不是类型安全的。这意味着ArrayList 可以被赋予任何类型的值:

ArrayList myList = new ArrayList();
myList.Add("this is a string");
myList.Add(19); //Notice that this is an int, but it doesn't throw an error!

这是一个问题,因为当您使用列表时,您不知道列表中的类型。抛出错误的可能性非常高。

避免使用ArrayLists!请改用通用列表,例如List<T>

【讨论】:

  • 你不能通过泛型使 ArrayList 类型安全吗?: ArrayList myList = new ArrayList();或者你是说更喜欢这个?: List myList = new ArrayList();
【解决方案2】:

类型安全和强类型是加载的短语,因此很难让各地的程序员确定一个精确的定义。但至少有足够的共识表明 ArrayList 在所有重要的方面都都不

不要使用 ArrayLists! 而是使用通用的 List<T> 集合。

【讨论】:

  • 你的意思是arraylist既不是TypeSafe也不是强类型
  • 我的意思是它不会强制存储在集合中的项目。
  • 但总之结论是一样的。既不是 TypeSafe 也不是强类型
  • 我会说 ArrayList 类本身强类型:ArrayList 是强类型 .Net 类型系统中的一种非常特殊的类型。属性和方法的数量和类型在运行时不会发生变化,使用反射检查将始终返回System.Collections.ArrayList。但在上下文中,这几乎没有集合中包含的数据那么重要,并且根本没有强制执行该数据的类型安全或强度。
  • 嗯......谢谢......你的答案是什么:A。 TypeSafe B. 强类型 C. TypeSafe 和强类型 D. 既不是 TypeSafe 也不是强类型
【解决方案3】:

ArrayList 数据结构不是类型安全的,也不是强类型的。您无法保证 ArrayList 中的对象类型,因此所有内容都存储为 Object,类似于 ASP.NET 中对象在 Session 缓存中的存储方式。

使用ArrayList 的最大缺点是当您想要访问实际列表中的对象时需要进行强制转换。如果列表中的任何值不是您期望的类型,那么您可能会遇到强制转换异常,并且处理该异常的代码很丑。

尽可能使用泛型,List<T> 是最接近 ArrayList 数据结构的泛型类型。

【讨论】:

    【解决方案4】:

    我不确定我是否理解您的问题。

    “强/弱类型”是编程语言的一种品质。 Java 是强类型的,这意味着它具有严格的语法,并且它可以在编译时发现代码中的问题,避免错误使其运行时。

    不过,Java 可能并不完全是类型安全的(我不确定确切的答案)。它允许泛型,这意味着您可以创建字符串的 ArrayList (ArrayList<String>)、整数的 ArrayList (ArrayList<Integer>)、布尔值的 ArrayList (ArrayList<Boolean>)。 ArrayList<T> 表示您可以用任何对象替换 <T>ArrayList<? extends T> 表示您可以替换为任何扩展 T 的 A、B、C、Potato 等。

    假设你有以下类:

    class Admin extends User {
        //Stuff
    }
    class Student extends User {
        //Stuff
    }
    class Teacher extends User {
        //Stuff
    }
    

    您甚至可以拥有用户对象的任何子对象的 ArrayList,例如:ArrayList<User>。 在此列表中,您可以添加 StudentAdminTeacher 对象。

    但是如果你不指定这个 ArrayList 保存什么类型的数据(例如:List l = new ArrayList();),你可以在其中放置任何 Object,导致它不是类型安全的。

    泛型滥用示例can be seen on Wikipedia

    【讨论】:

    • 完美。但我认为我的问题很清楚。泛型是我们用于类型安全实现的方式。但是 Arraylist 在其基础上既不是类型安全也不是强类型。这是真的吗?
    猜你喜欢
    • 2010-10-05
    • 1970-01-01
    • 2017-04-01
    • 2018-08-26
    • 2010-11-01
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多