2013-08-01 21 views
5

Tôi không biết chính xác sự khác biệt giữa "gõ mạnh" và "Loại an toàn" là!Danh sách Array có an toàn hoặc được đánh máy mạnh không?

Bạn có thể làm rõ điều này bằng một ngôn ngữ đơn giản không?

Giả sử chúng tôi đang sử dụng Arraylist, nhưng tôi không thể kết luận nó là an toàn hoặc được nhập mạnh. hoặc chúng ta có thể sử dụng nó như cả hai.

+0

Lưu ý rằng "gõ mạnh" thường áp dụng cho ngôn ngữ lập trình, trong khi "nhập an toàn" có khả năng đến từ cụm từ "thu thập an toàn" ... –

Trả lời

6

An ArrayList không an toàn. Điều này có nghĩa là ArrayList có thể được gán một giá trị của bất kỳ loại:

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! 

Đây là một vấn đề bởi vì khi bạn đi đến sử dụng danh sách, bạn không biết những loại có trong danh sách. Khả năng xảy ra lỗi được ném rất cao.

Tránh sử dụng ArrayLists! Thay vào đó, hãy sử dụng danh sách chung chung, chẳng hạn như List<T>

6

Loại an toàn và được nhập mạnh là các cụm từ được tải, do đó khó có thể lập trình ở khắp mọi nơi để ghim xuống định nghĩa chính xác. Nhưng có ít nhất đủ sự đồng thuận để tuyên bố rằng ArrayLists là không phải theo mọi cách quan trọng.

Không sử dụng ArrayLists! Thay vào đó, hãy sử dụng bộ sưu tập chung List<T>.

+0

bạn có nghĩa là mảng không phải là TypeSafe cũng không được đánh máy mạnh –

+0

Ý tôi là không thực thi cho các mục được lưu trữ trong bộ sưu tập. –

+0

nhưng trong kết luận ngắn là như nhau. vì TypeSafe cũng không được gõ mạnh –

0

Cấu trúc dữ liệu ArrayList không an toàn và không được nhập mạnh. Bạn không thể đảm bảo loại đối tượng nào nằm trong một ArrayList, do đó mọi thứ được lưu trữ dưới dạng Object, tương tự như cách đối tượng được lưu trữ trong bộ nhớ cache Session cho ASP.NET.

Nhược điểm lớn nhất khi sử dụng ArrayList là quá trình truyền cần thiết để xảy ra bất cứ khi nào bạn muốn truy cập vào các đối tượng trong danh sách thực tế. Nếu bất kỳ giá trị nào trong danh sách không thuộc loại bạn mong đợi, thì bạn có khả năng sẽ nhận được các ngoại lệ truyền và mã để xử lý điều đó chỉ là xấu xí.

Sử dụng Generics bất cứ khi nào có thể, với List<T> là loại chung nhất gần nhất với cấu trúc dữ liệu ArrayList.

0

Tôi không chắc mình hiểu câu hỏi của bạn.

"Loại mạnh/yếu" là chất lượng của ngôn ngữ lập trình. Java được gõ mạnh mẽ, có nghĩa là nó có một cú pháp nghiêm ngặt, và nó có thể tìm thấy các vấn đề trong mã của bạn tại thời gian biên dịch, trước khi các lỗi làm cho nó chạy thời gian.

Java có thể không chính xác là loại an toàn, mặc dù (tôi không chắc chắn về câu trả lời chính xác). Nó cho phép Generics, có nghĩa là bạn có thể tạo một ArrayList của Strings (ArrayList<String>), ArrayList của số nguyên (ArrayList<Integer>), ArrayList của Booleans (ArrayList<Boolean>). ArrayList<T> có nghĩa là bạn có thể thay thế <T> bằng bất kỳ đối tượng nào. ArrayList<? extends T> có nghĩa là bạn có thể thay thế với bất kỳ A, B, C, khoai tây, vv mà kéo dài T.

Giả sử bạn có các lớp sau:

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

Bạn thậm chí có thể có một ArrayList của bất kỳ đứa trẻ của một Đối tượng người dùng, ví dụ: ArrayList<User>. Danh sách này, bạn có thể thêm Học sinh, Quản trịGiáo viên đối tượng. Tuy nhiên, nếu bạn không chỉ định loại dữ liệu mà ArrayList này nắm giữ (ví dụ: List l = new ArrayList();), bạn có thể đặt bất kỳ Object nào vào trong đó, khiến nó không được gõ an toàn.

Ví dụ về lạm dụng Generics can be seen on Wikipedia.

+1

Hoàn hảo.Nhưng tôi nghĩ câu hỏi của tôi rất rõ ràng. Generic là cách mà chúng tôi sử dụng để triển khai an toàn types.but Arraylist trong các khái niệm cơ bản của nó, không phải là loại an toàn cũng không mạnh mẽ. là tuyên bố đúng này. –

Các vấn đề liên quan