2010-04-14 23 views
19

Ho una funzione che accetta un numero variabile di parametri:Java Funzione Variadica parametri

foo (Class... types); 

In cui ottengo un certo numero di tipi di classe. Avanti, voglio avere una funzione

bar(??) 

che Will accetta un numero variabile di parametri così, ed essere in grado di verificare che le variabili sono lo stesso numero (che è facile) e dello stesso tipo (il disco parte) come specificato in foo.

Come posso farlo?

Edit: per chiarire, una chiamata potrebbe essere:

foo (String.class, Int.class); 
bar ("aaa", 32); // OK! 
bar (3); // ERROR! 
bar ("aa" , "bb"); //ERROR! 

Inoltre, foo e bar sono metodi della stessa classe.

+0

Non ho capito il tuo requisito. Cosa intendi con "lo stesso numero specificato in foo"? Non esiste un tale numero. Ogni chiamata a pippo può essere con un numero diverso di argomenti. – duduamar

+0

La documentazione di oracle descrive parametri arbitrari come "varargs": http://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html. Fondamentalmente solo un array, come lo è in ruby ​​e altri linguaggi di programmazione. – JohnMerlino

risposta

33

Qualcosa di simile a questo:

private Class<?>[] types; 

public void foo(Class<?>... types) 
{ 
    this.types = types; 
} 

public boolean bar(Object... values) 
{ 
    if (values.length != types.length) 
    { 
     System.out.println("Wrong length"); 
     return false; 
    } 
    for (int i = 0; i < values.length; i++) 
    { 
     if (!types[i].isInstance(values[i])) 
     { 
      System.out.println("Incorrect value at index " + i); 
      return false; 
     } 
    } 
    return true; 
} 

Ad esempio:

test.foo(String.class, Integer.class); 
test.bar("Hello", 10); // Returns true 
test.bar("Hello", "there"); // Returns false 
test.bar("Hello"); // Returns false 

(Ovviamente si vorrà cambiare il modo vengono riportati i risultati ... forse usando un'eccezione per i dati non validi.)

Problemi correlati