cuốn sách gpt4 ai đã làm

java - kế thừa lớp: chung mở rộng chung

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 02:58:22 26 4
mua khóa gpt4 Nike

Giả sử tôi có một lớp học đơn giản

lớp công khai MyObject {
}

Và giao diện xử lý xử lý các lớp con MyObject

giao diện công cộng MyObjectHandler{
Danh sách xử lý(Danh sách đối tượng);
}

Giả sử tôi có BigObjects và SmallObjects (cả hai đều mở rộng MyObject) và tôi muốn đặt các trình xử lý riêng cho chúng. Vì vậy, tôi đã tạo hai giao diện MyObjectHandler với các giao diện chung cụ thể.

lớp BigObject mở rộng MyObject {}
lớp SmallObject mở rộng MyObject {}

// Giao diện xử lý
giao diện BigObjectHandler mở rộng MyObjectHandler{}
giao diện SmallObjectHandler mở rộng MyObjectHandler{}

// Bộ xử lý bê tông
lớp BigHandler1 triển khai BigObjectHandler {....}
lớp BigHandler2 triển khai BigObjectHandler {....}

lớp SmallHandler1 triển khai SmallObjectHandler {....}
lớp SmallHandler2 triển khai SmallObjectHandler {....}

Bây giờ giả sử chúng ta đã tạoTóm tắtHandlerChain<...>lớp trừu tượng Do đó, chúng ta có thể tạo lớp BigHandlerChain và đưa BigHandler vào (giống như SmallHandlerChain).

lớp BigHandlerChain mở rộng Tóm tắtHandlerChain {
// Chỉ tiêm các phần tử con của BigObjectHandler Ví dụ: qua spring @Autowired.
trình xử lý BigHandlerChain(List công khai) {
this.handlers = người xử lý;
}
}

Câu hỏi: Có thể tạo một Tóm tắtHandlerChain hoàn hảo cho tình huống này không?

Giải pháp khả thi 1

lớp trừu tượng công khai HandlerChain {

trình xử lý Danh sách riêng;

public HandlerChain(List handler) {
this.handlers = người xử lý;
}

công khai Danh sách doChain(List object) {
for (Trình xử lý T: trình xử lý) {
object = handler.handle(object);
}
trả lại đồ vật;
}
}

Điều này hoạt động, nhưng trong handler.handle(object)tôi hiểu Lệnh gọi 'xử lý (Danh sách )' được bỏ chọn với tư cách là thành viên của loại thô 'MyObjectHandler' , vì vậy tôi nên thêm @SuppressWarnings("không được chọn")Điều đó không tốt lắm.

Giải pháp khả thi 2

lớp trừu tượng công khai HandlerChain> {

...

công khai Danh sách doChain(List object) {
for (Trình xử lý T: trình xử lý) {
object = handler.handle(object);
}
trả lại đồ vật;
}
}

không hoạt động hiện hữu handler.handle(object)tôi hiểu xử lý (java.util.List>) không thể được áp dụng cho (java.util.List) .Tại sao tôi không thể chuyển đối tượng cho trình xử lý trong trường hợp này? Ký tự đại diện mở rộng MyObject, V mở rộng MyObject. Không đủ?

Giải pháp khả thi 3

lớp trừu tượng công khai HandlerChain, V mở rộng MyObject> {

...

Danh sách công khai doChain(List object) {
for (Trình xử lý T: trình xử lý) {
object = handler.handle(object);
}
trả lại đồ vật;
}
}

Điều này có hiệu quả, nhưng trong trường hợp này tôi nên định nghĩa BigHandlerChain là lớp BigHandlerChain mở rộng Tóm tắtHandlerChain .NhưngTrình xử lý đối tượng lớnđã chứa thông tin về lớp mà nó có thể xử lý được nên nó là sự trùng lặp thông tin.

Giải pháp khả thi 4

lớp trừu tượng công khai HandlerChain> {

...

Danh sách công khai doChain(List object) {
for (Trình xử lý T: trình xử lý) {
object = handler.handle(object);
}
trả lại đồ vật;
}
}

Đây là giải pháp tôi mong đợi từ java nhưng nó không hoạt động! Tôi không thể khai báo lớp như thế này! ...class HandlerChain .Tại sao tôi có thể sử dụng các ký tự đại diện đằng sau MyObjectHandler nhưng không thể sử dụng cấu trúc này?

câu trả lời hay nhất

Giải pháp một

Cái này hoạt động, nhưng trong handler.handle(objects) tôi nhận được lệnh gọi Unchecked tới 'handle(List)' với tư cách là thành viên của loại thô 'MyObjectHandler', vì vậy tôi nên thêm @SuppressWarnings("unchecked") điều đó không tốt lắm.

Thật vậy, bởi vì MyObjectHandlerlà một loại chung chung, nhưng bạn đã không Chuỗi xử lý Tham số loại chỉ định loại của nó.

Tùy chọn 2

Không hoạt động. Trong handler.handle(objects) tôi nhận được điều khiển (java.util.List>) không thể áp dụng cho (java.util.List). Tại sao tôi không thể chuyển đối tượng cho trình xử lý trong trường hợp này? MyObject và V mở rộng MyObject vẫn chưa đủ?

没有。 ? mở rộng MyObjectVề cơ bản nói rằng nó dành cho một số phần mở rộng loại không xác định đối tượng của tôi , nhưng bạn không nói cái nào. Bạn có thể tạo một lớp lớp công khai BigHandlerChainNhưng cung cấp Đối tượng nhỏ liệt kê các trường hợp để doChain .

Lựa chọn ba

Cái này hoạt động, nhưng trong trường hợp này tôi nên định nghĩa BigHandlerChain là lớp BigHandlerChain mở rộng Tóm tắtHandlerChain Nhưng BigObjectHandler đã chứa thông tin về các lớp, có thể được nó xử lý, vì vậy đó là sự trùng lặp thông tin.

Đúng là có một số thông tin trùng lặp ở đây, nhưng đó là điều có thể xảy ra khi kết hợp các loại chung chung như thế này. do bạn doChainMột phương thức hoạt động trên một loại và phải chỉ định loại đó có thể làm gì. Hãy nghĩ về nó như thể bạn sắp giải quyết đối tượng lớnDanh sách và trình xử lý bạn cung cấp phải có khả năng xử lý BigObjects.

Giải pháp 4

Đây là một giải pháp mà tôi mong đợi từ java, nhưng nó không hoạt động! Tôi không thể khai báo lớp như thế này ...class HandlerChain. Tại sao tôi có thể sử dụng các ký tự đại diện sau MyObjectHandler, nhưng không thể sử dụng cấu trúc này?

问题是 VCho biết một loại cụ thể, thay vì ký tự đại diện, vì vậy bạn cần chỉ định V là gì.

Nói cách khác, mặc dù có một số thông tin trùng lặp nhưng giải pháp 3 của bạn là cách tiếp cận đúng. Thật không may, bạn sẽ thấy nhiều điều này hơn trong Java. Getters/setters được cho là bản soạn sẵn không cần thiết khi các từ khóa sửa đổi cụ thể trên một trường có thể đạt được hiệu quả tương tự (như trong Ruby).

Tuy nhiên, lưu ý rằng nếu bạn chỉ định lớp trừu tượng công khai HandlerChain, V mở rộng MyObject> , bạn chỉ định chuỗi chỉ áp dụng cho một loại cụ thể MyObjectHandler .Vì tôi nghĩ bạn có thể cần một loạt các trình xử lý khác nhau có khả năng xử lý cùng một loại đối tượng, nên tốt hơn hết bạn chỉ nên chỉ định loại đối tượng:

lớp trừu tượng công khai HandlerChain {

trình xử lý Danh sách riêng tư<>>;

public HandlerChain(List<>> trình xử lý) {
this.handlers = người xử lý;
}

Danh sách công khai doChain(List object) {
for (Trình xử lý MyObjectHandler : trình xử lý) {
object = handler.handle(object);
}
trả lại đồ vật;
}

}

Về java - kế thừa lớp: generic mở rộng chung, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/43612264/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress