Điều này có vẻ giống như một câu hỏi mới, nhưng lần cuối cùng tôi làm việc với Java, ngôn ngữ không có generics. Tôi có một hệ thống phân cấp lớp (tên đã thay đổi để được như tổng quát càng tốt):Thành viên Java tĩnh trong một phân lớp được truy cập thông qua một phụ huynh chung
public abstract class AbstractBase { .... }
public class ConcreateSubA extends AbstractBase { .... }
public class ConcreateSubB extends AbstractBase { .... }
...
public class ConcreateSubZZ9PluralZAlpha extends AbstractBase { .... }
...
Tôi đang cố gắng để làm sạch một số mã di sản, và có một nơi mà một tấn trùng lặp lặp đi lặp lại có thể tất cả là yếu tố ra vào một thói quen thông qua Generics. (Tôi đang nghĩ đến Generics vì khi thói quen này được gọi, nó cần phải hoạt động trên chỉ là một trong các lớp bê tông.)
Các chàng thường xuyên như
public <Thing extends AbstractBase> void someFunc()
{
another_function_call (Thing.concreteSpecialToken);
// could also be
// another_function_call (Thing.concreteSpecialToken());
// if methods are more feasible than fields
// Cannot use
// another_function_call (Thing().concreteSpecialToken());
// because creating instances of these types is a Major Operation[tm]
}
Tôi đi đây hiểu về một dòng zillion , nhưng đó là phần quan trọng: someFunc()
là loại tham số (nó thực sự có đối số nhưng không ai trong số họ là những điều nên không suy luận). Cuối cùng tôi cần lấy một mã thông báo đặc biệt và đây là nơi tôi bị mờ.
Mã thông báo là các chuỗi độc đáo rất lớn cho mỗi lớp cụ thể. Chúng dựa trên lớp, không dựa trên cá thể. Giá trị mã thông báo thực tế được khai báo là trường private static final
trong mỗi lớp con.
Vì vậy, tôi cần sử dụng các phương thức/trường công khai của một lớp cơ sở để (cuối cùng) nhận được trường tĩnh riêng của một lớp con. Rõ ràng tôi không thể khai báo một phương thức abstract static
trong cơ sở, bởi vì điều đó không có ý nghĩa gì cả. Nếu dữ liệu được dựa trên cá thể, thì điều này sẽ là tầm thường, với một bộ thu thập đa hình trong lớp cơ sở, nhưng các công cụ phân lớp là tĩnh.
Tôi cảm thấy như tôi đang thiếu một tính năng của Generics Java ở đây, nhưng tôi không thể sử dụng Thing.whatever()
trừ khi whatever
là một cái gì đó có thể khai báo trong lớp cơ sở trừu tượng. Tôi đang chạy lên chống lại một trong hai giới hạn của Java hoặc thiếu chuyên môn của tôi cố gắng thu hẹp khoảng cách. Một nỗ lực mà tôi thực hiện có vẻ đầy hứa hẹn cũng có rất nhiều sự sao chép mã tất cả các con đường trong hệ thống phân cấp lớp, xác định các phương thức trừu tượng với cùng một mã chính xác hơn ... đó là những gì generics được cho là để ngăn chặn!
+1 cho 'ZZ9PluralZAlpha' :-) –