2013-01-08 27 views
6

Possible Duplicate:
What is the difference between java.lang.Void and void?Đặt các loại chung của SwingWorker làm mất hiệu lực?

Tôi muốn tạo lớp bê tông cho SwingWorker với cả loại kết quả cuối cùng và trung gian là void. Tôi đã viết đoạn mã sau:

class AnswerWorker extends SwingWorker<void, void> { 
    protected void doInBackGround() { 
     System.out.println("what is your problem!!"); 
    } 
} 

này đã cho tôi được lỗi sau:

Multiple markers at this line- 
    Syntax error on token "void", Dimensions expected after this token. 
    Syntax error on token "void", Dimensions expected after this token. 

Tuy nhiên khi tôi đã thay đổi mã từ void để Void (ví dụ nhỏ v vốn V), nó làm việc tốt, mặc dù tôi vẫn bị buộc phải return null; vào cuối phương thức doInBackground().

Tại sao điều này? Tôi biết Void là một lớp học trong gói java.lang nhưng tài liệu không nói nhiều về nó (ít nhất là tôi không thể theo dõi: p)

Thanx trước !!

+0

và quan trọng có thể là hai tham số, có thực sự mKorbel

Trả lời

11

class AnswerWorker extends SwingWorker<Void, Void>
Nên thực hiện thủ thuật. Đó là vì generics luôn cần các đối tượng như các tham số. Họ cũng không thể lấy nguyên thủy. Void giống như Trình bao bọc để loại bỏ vấn đề này.

Bây giờ là nguyên nhân tại sao bạn vẫn cần phải trả lại một cái gì đó:
Như tài liệu nói, Void vẫn là một lớp. Vì vậy, bạn vẫn cần phải trả lại một đối tượng. Vì không thể khôi phục nên chỉ có khả năng trả về null. Vì vậy, Void không hoàn toàn giống như từ khóa void. Vẫn cần phải trả về một tham chiếu đến một đối tượng (tham chiếu null trong trường hợp này).

Có một điều quan trọng: Generics buộc bạn sử dụng các đối tượng.void, như các loại nguyên thủy, không phải là đối tượng. Đó là oop thiên nhiên tinh khiết của Java;)

3

Lớp java.lang.Void ban đầu được giới thiệu rất lâu trước khi Generics như một nơi để đưa hằng số Void.TYPE, đối tượng Class đại diện cho loại void, và được trả về bởi java.lang.reflect.Method.getReturnType() cho void phương pháp (bằng cách tương tự với Integer.TYPE, Character.TYPE, v.v. đại diện cho int, char, ...).

Lớp Void không thể được khởi tạo (do đó chỉ có giá trị hợp lệ bạn có thể gán cho một biến kiểu Voidnull) nhưng nó đã được đồng chọn kể từ sự ra đời của Generics như một dấu hiệu hữu ích cho các tình huống như thế này trong đó cú pháp yêu cầu tên lớp nhưng bạn không thực sự muốn sử dụng.

+0

Bạn có thể chỉ cho tôi một số tài liệu chính thức/có thẩm quyền để xác nhận câu này trong ngữ cảnh của 'SwingWorker' ?: _it đã được đồng chọn hay không kể từ khi giới thiệu Generics một mã thông báo hữu ích cho các tình huống như thế này khi cú pháp yêu cầu tên lớp nhưng bạn không thực sự muốn sử dụng one_. –

+0

@JaimeHablutzel Tôi không thể, tôi đã chọn thuật ngữ "đồng chọn" để ám chỉ rằng đó là một quy ước không chính thức chứ không phải là một đề xuất chính thức.Nếu bạn luôn luôn trả về 'null' thì nó không quan trọng bạn sử dụng lớp nào, nhưng' Void' là một quy ước hữu ích. Quy ước tương tự được sử dụng bởi ['java.util.concurrent.RecursiveAction'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveAction.html), đó là một" không có kết quả "' ForkJoinTask' luôn trả về 'null', vì vậy nó mở rộng' ForkJoinTask '. –

+0

thực tế là có một lớp trong API Java tiêu chuẩn bằng cách sử dụng 'Void' giống như có vẻ khá tham chiếu chính thức với tôi. Cảm ơn!. –

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