2015-12-08 15 views
5

Đó là mã tôi có cho một bài tập lập trình cho lớp học. Tôi không chắc chắn lý do tại sao tôi sử dụng Task other = (Task)x; hoặc những gì nó đang làm ở đây. Phần còn lại tôi hiểu. Nếu bất cứ ai có một lời giải thích nhanh chóng về những gì thực sự đang làm ở đây tôi sẽ rất tuyệt vời. Cảm ơn bạn!Tại sao có một dàn diễn viên trong một đối tượng compareTo (Object)

+1

Bạn đang thực hiện 'Comparable' hoặc một số giao diện khác? Nếu vậy, nó sẽ có giá trị thêm tuyên bố lớp học. –

Trả lời

2

Bạn đang đúc Object x để Task other - ObjectTask nhiều loại khác nhau, vì vậy bạn cần các diễn viên để bạn có thể đối xử với x như các loại dự kiến ​​(và nhận được đến đó là lĩnh vực).

Thông thường trong compareTo() đầu tiên bạn sẽ phải một cái gì đó giống như if (x instanceof Task) trước một cách mù quáng đúc nó - nếu bạn không và các loại khác nhau sau đó mọi thứ sẽ sụp đổ)

+1

... và bởi vì điều đó không xảy ra, một cái gì đó sẽ đi sai nếu bạn so sánh nói một nhiệm vụ và một chuỗi. – gnasher729

+0

Được rồi, cảm ơn bạn rất nhiều! –

+0

@SarahDiri: Nếu câu trả lời này giúp bạn, hãy chấp nhận nó :) –

2

Chữ ký phương pháp có một đối tượng Object loại như vậy để tham chiếu biến số priority trong đối tượng được truyền vào, nó phải thực hiện một phép đúc đối tượng Task vì biến chỉ tồn tại trong lớp Task.

Cá nhân, mặc dù tôi nghĩ rằng đây là thực hành không tốt vì bạn không biết loại đối tượng nào đang được chuyển vào (bất kỳ lớp con nào có thể được chuyển vào), vì vậy một trường hợp séc sẽ không mất đi số tiền bạn muốn chạy vào một lỗi thời gian chạy của một ClassCastException. Bạn có thể sử dụng generics để chỉ định loại đối tượng nào bạn muốn so sánh. Vì vậy, chứ không phải làm điều này ...

public class Task implements Comparable { 
    private int priority = 1; 

    @Override 
    public int compareTo(Object o) { 
     if (o instanceof Task) { 
      Task t = (Task) o; 
      return this.priority < t.priority; 
     } 

     return -1; 
    } 
} 

... bạn có thể làm điều này ...

public class Task implements Comparable<Task> { 
    private int priority = 1; 

    @Override 
    public int compareTo(Task t) { 
     return this.priority < t.priority; 
    } 
} 
+0

Tôi có thể thay đổi 'Object x' thành một cái gì đó cụ thể hơn (trong trường hợp này,' Task x' có thể)? Tôi đã bị ấn tượng bởi chính bài học rằng đó chỉ là 'cách nó được thực hiện'. –

+0

@SarahDiri Chỉ có hai cách để "thay đổi" 'x' từ' Object' thành 'Task' là thực hiện phép đúc (mà bạn đã làm) hoặc thay đổi tham số phương thức để chỉ cho phép các đối tượng' Task' được thông qua trong tham số. Java cho phép điều này bằng cách sử dụng Generics (vì vậy 'thực hiện Comparable ' thay vì 'thực hiện Comparable'). Sử dụng điều này sẽ chỉ cho phép các đối tượng 'Task' được truyền vào. – Ocracoke

+0

Xem thêm [Loại thô là gì và tại sao chúng ta không nên sử dụng nó?] (Http://stackoverflow.com/questions/2770321/what-is -a-nguyên-loại-và-tại sao-không nên-chúng-dùng-nó) –

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