Tôi muốn viết một bí danh loại để rút ngắn mã Scala đẹp và được đóng gói. Giả sử tôi có một số bộ sưu tập có thuộc tính là danh sách bản đồ, giá trị là các bộ dữ liệu. Loại của tôi sẽ viết một cái gì đó như List[Map[Int, (String, String)]]
hoặc bất kỳ thứ gì chung chung hơn như ứng dụng của tôi cho phép nó. Tôi có thể tưởng tượng có một siêu người yêu cầu Seq[MapLike[Int, Any]]
hoặc bất cứ điều gì nổi thuyền của tôi, với các lớp con cụ thể là cụ thể hơn.Bí danh loại Scala bao gồm đối tượng đồng hành [người mới bắt đầu]
Sau đó tôi muốn viết bí danh cho loại dài này.
class ConcreteClass {
type DataType = List[Map[Int, (String, String)]]
...
}
Tôi sẽ vui vẻ sử dụng ConcreteClass#DataType
ở mọi nơi tôi có thể sử dụng và sử dụng nó.
Bây giờ giả sử tôi thêm một chức năng
def foo(a : DataType) { ... }
Và tôi muốn gọi nó từ bên ngoài với một danh sách rỗng. Tôi có thể gọi foo(List())
, nhưng khi tôi muốn thay đổi loại cơ bản của mình thành một loại khác là Seq
, tôi cũng sẽ phải quay lại và thay đổi mã này. Bên cạnh đó, nó không phải là rất rõ ràng danh sách trống này được thiết kế như là một DataType
. Và đối tượng đồng hành không có phương thức List
được liên kết, vì vậy tôi không thể gọi DataType()
hoặc DataType.empty
. Sẽ càng khó chịu hơn khi tôi cần những danh sách không trống vì tôi sẽ phải viết ra một phần quan trọng của loại dài này.
Có cách nào tôi có thể yêu cầu Scala hiểu loại của tôi là giống nhau không, kể cả đối tượng đồng hành với các phương thức tạo của nó, vì lợi ích của việc rút ngắn mã và bôi đen nó? Hoặc, tại sao tôi không nên làm điều này ngay từ đầu?
Nếu bạn không có ý định phân lớp 'ConcreteClass' để ghi đè' DataType', bạn có thể đặt cả hai bí danh 'type' và' val' vào đối tượng đồng hành (thay vì có một lớp trong lớp). Đây là cách các bí danh trong đối tượng gói 'scala' hoạt động. –
Bạn thực sự rất đúng. Tôi sẽ làm điều này từ bây giờ. Cảm ơn. – Jean
Ngoại trừ d là loại Danh sách [Không có gì] – sourcedelica