Java enum là tuyệt vời. Thuốc generic cũng vậy. Tất nhiên tất cả chúng ta đều biết những hạn chế sau này vì loại tẩy xóa. Nhưng có một điều tôi không hiểu, Tại sao tôi không thể tạo ra một enum như thế này:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
Lần <T>
lượt tham số loại chung này có thể hữu ích ở nhiều nơi. Tưởng tượng một tham số kiểu chung cho một phương thức:
public <T> T getValue(MyEnum<T> param);
Hoặc thậm chí trong lớp enum:
public T convert(Object o);
Ví dụ cụ thể hơn # 1
Vì ví dụ trên có vẻ quá trừu tượng đối với một số người, đây là một ví dụ thực tế hơn về lý do tại sao tôi muốn làm điều này. Trong ví dụ này tôi muốn sử dụng
- Enums, bởi vì sau đó tôi có thể liệt kê một bộ khóa thuộc tính hữu hạn
- Generics, bởi vì sau đó tôi có thể có loại an toàn ở mức phương thức để lưu trữ các thuộc tính
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
Ví dụ cụ thể hơn # 2
Tôi có một bảng liệt kê các loại dữ liệu:
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
Mỗi enum nghĩa đen rõ ràng sẽ có các thuộc tính bổ sung dựa trên loại chung <T>
, đồng thời, là một enum (bất biến, đơn lẻ, liệt kê, v.v.)
Câu hỏi:
Không ai nghĩ về điều này? Đây có phải là một hạn chế liên quan đến trình biên dịch? Xem xét thực tế, từ khóa " enum " được triển khai dưới dạng đường cú pháp, đại diện cho mã được tạo cho JVM, tôi không hiểu giới hạn này.
Ai có thể giải thích điều này cho tôi? Trước khi bạn trả lời, hãy xem xét điều này:
- Tôi biết các loại chung chung bị xóa :-)
- Tôi biết có cách giải quyết bằng cách sử dụng các đối tượng Class. Họ là cách giải quyết.
- Các kiểu chung dẫn đến các kiểu kiểu trình biên dịch được tạo ở bất cứ nơi nào có thể áp dụng (ví dụ: khi gọi phương thức convert ()
- Loại chung <T> sẽ có trên enum. Do đó, nó bị ràng buộc bởi mỗi chữ của enum. Do đó trình biên dịch sẽ biết, nên áp dụng kiểu nào khi viết một cái gì đó như
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
- Điều tương tự áp dụng cho tham số loại chung trong
T getvalue()
phương thức. Trình biên dịch có thể áp dụng kiểu truyền khi gọiString string = someClass.getValue(LITERAL1)
enum
thành thành ngữ "typeafe enum" mà chúng ta đã sử dụng trước Java 1.5. Đột nhiên, bạn có thể có các thành viên enum của bạn tham số hóa. Đó có lẽ là những gì tôi sẽ làm bây giờ.