2015-06-20 21 views
5

Tôi đã nhận thấy điều này ở giữa sự phát triển.Tại sao toán tử Ternary không hoạt động bên trong một đối số phương thức trong java

Tại sao toán tử Ternary không hoạt động bên trong một đối số phương thức? Ở đây rõ ràng là InputStream hoặc (khác) String.

class A{ 

    public static boolean opAlpha(InputStream inputStream) { 

     // Do something 

     return true; 

    } 

    public static boolean opAlpha(String arg) { 

     // Do something else 

     return true; 
    } 

    public static void main(String[] args) throws Exception { 

     boolean useIsr = true; 

     InputStream inputStream = null; 
     String arg = null; 

//  boolean isTrue = useIsr ? A.opAlpha(inputStream): A.opAlpha(arg); // This is OK. 
     boolean isTrue = A.opAlpha(useIsr ? inputStream : arg); // This is not. (Error : The method opAlpha(InputStream) in the type A is not applicable for the arguments (Object)) 

    } 

} 
+1

Không có quá tải toán tử ở đây. – EJP

+2

Và bình luận bình thường của tôi: Nó không phải là toán tử bậc ba, đó là [* toán tử điều kiện *] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls- 15,25). Đúng là nó là ** một toán tử ternary (một toán tử chấp nhận ba toán hạng), và đúng là nó là Java duy nhất, nhưng trong lý thuyết có thể có những người khác tại một số điểm ... :-) –

+0

Cảm ơn T.J. Có quan điểm của bạn! – namalfernandolk

Trả lời

6

Khái niệm useIsr ? inputStream : arg là loại Object, vì đó là loại phổ biến của inputStream (InputStream) và arg (String).

Bạn không có bất kỳ phương thức opAlpha nào chấp nhận Object. Do đó lỗi biên dịch.

+0

@Namalak 'Điều đó có nghĩa là vì nó gọi các phương thức tùy thuộc vào loại Lớp. Không phải loại đối tượng'. Tôi không biết ý bạn là gì. Nếu bạn có nghĩa là nó gọi các phương thức tùy thuộc vào kiểu thời gian biên dịch của các đối số và không phải kiểu thời gian chạy thì bạn đã đúng. Trình biên dịch quyết định thời gian biên dịch mà phiên bản quá tải của phương thức sẽ được gọi. – Eran

+0

Đó là sự thật Eran. Quên nguyên tắc quá tải chung của phương thức trong một thời gian. Tôi đã xóa nhận xét của mình khi tôi lưu ý điều đó. Tôi không lưu ý bình luận của bạn khi xóa nó. Tôi sẽ cố gắng để cho nó diaplay một lần nữa kể từ khi bạn đã trả lời rằng. Cảm ơn bạn anyway cho câu trả lời. Nó xóa tôi qua! – namalfernandolk

7

Trình biên dịch cần quyết định phương thức quá tải nào cần gọi trong phương thức main của bạn. Cuộc gọi phương thức phải được đặt trong bytecode được biên dịch của main và không được quyết định khi chạy.

Trong thực tế, mặc dù bạn biết rằng các loại biểu thức điều kiện là một trong hai InputStream hoặc String, trình biên dịch thấy loại của nó như Object. Từ Section 15.25.3 of the Java Language Specification:

Biểu thức điều kiện tham chiếu là biểu thức poly nếu nó xuất hiện trong ngữ cảnh gán hoặc ngữ cảnh yêu cầu (§5.2. §5.3). Nếu không, nó là một biểu thức độc lập.

Trong trường hợp biểu thức điều kiện nhiều tài liệu tham khảo xuất hiện trong một bối cảnh của một loại đặc biệt với loại mục tiêu T, biểu thức toán hạng thứ hai và thứ ba của nó tương tự xuất hiện trong một bối cảnh cùng loại với loại mục tiêu T.

Loại một biểu thức điều kiện tham chiếu poly là giống như kiểu đích của nó.

Loại một biểu thức điều kiện tham khảo độc lập được xác định như sau:

  • Nếu toán hạng thứ hai và thứ ba có cùng loại (trong đó có thể là loại null), thì đó là kiểu của biểu thức điều kiện.

  • Nếu loại của toán hạng thứ hai và thứ ba là loại rỗng và loại toán hạng khác là loại tham chiếu, thì loại biểu thức có điều kiện là loại tham chiếu đó.

  • Nếu không, toán hạng thứ hai và thứ ba thuộc loại S1 và S2 tương ứng. Gọi T1 là kiểu kết quả từ việc áp dụng chuyển đổi quyền anh sang S1, và để T2 là loại kết quả từ việc áp dụng chuyển đổi quyền anh sang S2. Loại biểu thức điều kiện là kết quả của việc áp dụng chuyển đổi chụp (§5.10.10) sang lub (T1, T2).

nơi lub(T1, T2) đứng cho "Least Upper Bound" các loại T1T2. Loại giới hạn trên ít nhất là InputStreamStringObject.

+0

Cảm ơn bạn manouti. Câu trả lời của bạn rất thông tin và tôi tin rằng SOF phải có tùy chọn chấp nhận nhiều hơn một câu trả lời – namalfernandolk

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