2013-11-24 4 views
3

Вот пример:Концепция varargs и двусмысленность?

package com.demo; 
public class PassArray { 
    static void vaTest(int... v){ 
     System.out.println("no of args : "+v.length+"contents: "); 
     for (int x:v){ 
      System.out.println(x+" "); 
     } 
    } 
    static void vaTest(boolean... v){ 
     System.out.println("no of args : "+v.length+"contents: "); 
     for (boolean x:v){ 
      System.out.println(x+" "); 

     } 
    } 
    public static void main(String args[]){ 

     vaTest(1,2,3); 
     vaTest(true,false,true); 
     vaTest();//Error:Ambiguous! 
    } 
} 

Может кто-нибудь сказать мне:

У меня есть вопрос

1.Why неоднозначны ошибки больше появляться?

2.I имеют один параметр так же, как переменные аргументы

int doIt(int a,int b,int c,int... vals) 

Почему переменные аргументы должны быть объявлены в последний раз?

  1. Что такое varargs и двусмысленность?
+7

Какой метод следует вызывать с помощью 'vaTest();' Вы не знаете? Также не компилятор. –

ответ

5

Поскольку существует два способа вызова метода для вызова vaTest();, компилятор не может определить, какой из них использовать.
Чтобы помочь этому, вы можете предоставить пустой массив выбранного типа:

vaTest(new int[] {}); 

Более подробную информацию можно найти в JLS 15.12.2.5. Choosing the Most Specific Method.

2

Почему возникает неоднозначная ошибка?

Поскольку вы не передали никаких аргументов, и оба метода являются действительными кандидатами для вызова, так как оба могут быть вызваны без каких-либо аргументов. Компилятор не может решить, к какому методу привязать вызов метода, поскольку нет типа параметра для различения методов.

Почему варгары должны быть объявлены последними?

Ну, так как люди, создавшие Java, хотели, чтобы это было объявлено. Может быть, они хотели, чтобы задача для компилятора была простой. Если varargs объявлены последним параметром, компилятор может просто продолжать связывать все аргументы после последнего параметра, отличного от vararg, к параметру vararg. Конечно, это было бы возможно даже в том случае, если vararg был разрешен где-то посередине, но для этого требовалось бы, чтобы компилятор привязывал параметры к концам сначала или, по крайней мере, какой-то алгоритм, чтобы выяснить, что есть достаточные аргументы, оставшиеся до привязать к дополнительным параметрам без vararg. Это сделало бы парсинг-комплекс, поскольку компилятор связывает аргумент метода слева направо (что потребовало бы некоторых изменений). Может быть, мыслитель языка думал, добавив, что эта функция не будет весить много, чтобы оправдать изменения в том, как компилятор связывает аргументы. Итак, это ограничение.

1

1.Why неоднозначной ошибка больше появляться?

Эта деталь уже был отвечен другим пользователям, красиво.

Почему варгары должны быть объявлены последними?

Ну вот как написано JAVA.Разумное объяснение я могу вспомнить, сохраняя обычное чтение направления в скобках () который имеет ассоциативность: слева направо, если мы хотим объявить функцию как:

public void aFunc(String... args, String x, String y, String z) 

Если вызвать эту функцию с точно три аргумента: aFunc("arg1", "arg2", "arg3"): Тогда у нас есть проблема с решением: какая переменная должна принадлежать параметру переменной arity args? Чтобы узнать ответ, нам нужно будет перейти от права налево, просто отменив обычный порядок скобки () ассоциативности.