2016-11-10 18 views
2

Код:Передача аргумента метода через тройной оператор в Java

public class Foo { 

    static void test(String s){ 
     System.out.println("String called"); 
    } 

    static void test(int s){ 
     System.out.println("int called"); 
    } 

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

     test(5>8? 5:8);   // Line 1 
     test(5>8? "he":"ha"); // Line 2 

     test(5>8? 5:"ha");  // Line 3 

     System.out.println(5<8? 5:"ha"); //Line 4 
    } 
} 

Когда я выполняю этот код я получаю следующую ошибку при Line 3

Foo.java:24: error: no suitable method found for test(INT#1) 
       test(5>8? 5:"ha");    // Line 3 
       ^

Использование подобного типа в тройном оператора не дать ошибку. Но использование различных типов дает ошибку только вызов метода test(5>8? 5:"ha");, но это работает для вызова System.out.println(5<8? 5:"ha");

Когда я добавить еще один перегруженный метод static void test(Object s){}, то //Line 3 компилирует.

Может ли кто-нибудь объяснить мне этот сценарий?

ответ

4

Каждое выражение в Java имеет тип. В Спецификации языка Java существуют некоторые сложные правила, в разделе the conditional operator, которые рассказывают нам, как найти тип условного выражения, например 5 > 8 ? 5 : "ha". Но простыми словами вы всегда получаете наиболее специфический тип, в который входят как второй, так и третий аргументы.

  • Для 5 > 8 ? 5 : 8, как 5 и 8 являются int, поэтому все это выражение имеет тип int.
  • Для 5 > 8 ? "he" : "ha" оба "he" и "ha": String, поэтому все это выражение имеет тип String.
  • Для 5 > 8 ? 5 : "ha", наиболее подходящий тип, который подходит как для 5, так и для "ha": Object. Так что все это выражение имеет тип Object.

Теперь, поскольку у вас есть версии test, которые принимают int и принять String, выражения test (5 > 8 ? 5 : 8) и test (5 > 8 ? "he" : "ha") и компиляции.

Но если у вас нет версии test, которая принимает Object, то test (5 > 8 ? 5 : "ha") не подлежит компиляции.

Это чрезмерное упрощение. Правила значительно сложнее, чем я описал, но это в основном потому, что они рассматривают различные случаи, связанные с операндами null, авто-боксом и автоматической распаковкой.

+0

niceely Answered! –

+0

Теперь я понимаю, как определить возвращаемый тип тернарного оператора. Основываясь на вашем объяснении, я задавался вопросом, имеет ли метод 'System.out.println()' перегруженный метод, который принимает параметр Object как параметр и обнаружил, что в PrintStream существует метод public void println (Object x) '. Если бы вы могли добавить этот момент в свой ответ, это будет полезно для других. –

+0

Я чувствую, что это совсем другая проблема. Кроме того, большинство программистов Java знают, что они могут передать любой объект, который им нравится, в 'System.out.println'. –

0

Вы вызываете метод перед вычислением выражения. Так как у метода нет перегрузки для теста (Object o), он не работает.

Вызвать метод после разрешения выражения левой стороны.

5>8?test(5):test("ha") 
0

При вызове функции

test(5>8? 5:8);
метод (в данном случае) предназначен для передачи параметров, следовательно, все это внутри скобок рассматриваются в качестве параметра, и нет необходимости/подходящего метода для обработки таких вид вызова (параметр должен быть Object), поскольку вы оцениваете int и String в одном из операторов. Следовательно, тройной оператор не может быть реализован.

Таким образом, вы можете использовать код, как этот

(5 > 8) ? test(param1): test(param2); 


или создать еще один тестовый метод, который принимает объект в качестве параметра, а затем оценить вещи внутри этого метода испытания. например

void test(Object o){ 
    //manipulate things here 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^