2011-02-10 10 views
13

Ad esempio, desidero creare una funzione che possa restituire qualsiasi numero (negativo, zero o positivo).Come scrivere la funzione Java che restituisce i valori di più tipi di dati?

Tuttavia, sulla base di alcune eccezioni, mi piacerebbe che la funzione restituisca BooleanFALSE

C'è un modo per scrivere una funzione che può restituire un into un Boolean?


Ok, quindi questo ha ricevuto molte risposte. Capisco che sto semplicemente affrontando il problema in modo errato e dovrei throw un qualche tipo di eccezione nel metodo. Per ottenere una risposta migliore, fornirò un codice di esempio. Si prega di non prendere in giro :)

public class Quad { 

    public static void main (String[] args) { 

    double a, b, c; 

    a=1; b=-7; c=12; 
    System.out.println("x = " + quadratic(a, b, c, 1)); // x = 4.0 
    System.out.println("x = " + quadratic(a, b, c, -1)); // x = 3.0 


    // "invalid" coefficients. Let's throw an exception here. How do we handle the exception? 
    a=4; b=4; c=16; 
    System.out.println("x = " + quadratic(a, b, c, 1)); // x = NaN 
    System.out.println("x = " + quadratic(a, b, c, -1)); // x = NaN 

    } 

    public static double quadratic(double a, double b, double c, int polarity) { 

    double x = b*b - 4*a*c; 

    // When x < 0, Math.sqrt(x) retruns NaN 
    if (x < 0) { 
     /* 
     throw exception! 
     I understand this code can be adjusted to accommodate 
     imaginary numbers, but for the sake of this example, 
     let's just have this function throw an exception and 
     say the coefficients are invalid 
     */ 
    } 

    return (-b + Math.sqrt(x) * polarity)/(2*a); 

    } 

} 
+2

Hai già parecchie risposte, quindi puoi vedere che è possibile, ma non bello. Ti consiglierei di spiegare per cosa ti serve. Allora probabilmente avrai una soluzione migliore. A proposito, l'eccezione potrebbe essere rappresentata anche lanciando un'eccezione. Restituendo Boolean.FALSE e non restituendo mai Boolean.TRUE è un odore di codice, si consideri la restituzione di Integer con valore restituito null anziché FALSE. – maaartinus

+2

L'utilizzo del valore di ritorno è una programmazione in stile C. Non che ci sia qualcosa di sbagliato in questo, ma prendi in considerazione le eccezioni. Questo è quello per cui sono fatti. – duffymo

risposta

12

No, non è possibile farlo in Java.

Tuttavia è possibile restituire un Object. E restituendo un oggetto si potrebbe tecnicamente restituire una classe derivata come java.lang.Integer o java.lang.Boolean. Tuttavia, non penso sia la migliore idea.

5

no. il meglio che puoi fare è restituire su istanza di una classe che gestisce tutte le cose che potresti voler restituire.

qualcosa come

public class ReturnObj { 
    public bool yesno; // yes or no 
    public int val; // for int values 
    public String mode; // mode describing what you returned, which the caller will need to understand. 
} 

, ovviamente, è necessario giocare con i nomi ....

Inoltre, questo mi sembra un odore di codice. Potresti essere in grado di rimuovere la necessità di fare qualcosa di simile qualificando il percorso che desideri al di fuori della tua funzione, quindi chiama una funzione specifica per ottenere un valore booleano o una funzione specifica per ottenere un int, a seconda della qualifica.

+0

Probabilmente dovresti usare un 'Enum', non un' String' –

1

No, un riferimento di reso a un cliente.

È possibile scrivere un oggetto risposta che incapsula un valore booleano e un int insieme e imposta i valori in base al proprio capriccio.

Ma se fossi un utente, penserei che il tuo progetto sia stato confuso.

3

Scrive una funzione che restituisce un Object. È necessario restituire gli oggetti wrapper Boolean o Integer. Quindi usa instanceof per capire quale usare.

0

questo potrebbe non essere la soluzione migliore a seconda di cosa si vuole fare, ma un modo semplice per risolvere il problema potrebbe essere quello di avere la funzione di restituire un int o una costante al di fuori della gamma possibile (come RETURNED_FALSE/TRUE) e controllare per quello.

10

Si potrebbe tecnicamente fare questo:

public <T> T doWork() 
{ 
    if(codition) 
    { 
     return (T) new Integer(1); 
    } 
    else 
    { 
     return (T) Boolean.FALSE; 
    } 
} 

Allora questo codice dovrebbe compilare:

int x = doWork(); // the condition evaluates to true 
boolean test = doWork(); 

Ma si potrebbe certamente incontrare le eccezioni di runtime se il metodo restituisce il tipo sbagliato. Devi anche restituire oggetti invece di primitive perché T viene cancellato su java.lang.Oggetto, che significa che il tipo restituito deve estendere l'oggetto (vale a dire essere un oggetto). L'esempio precedente utilizza l'autoboxing per ottenere un tipo di ritorno primitivo.

Non consiglierei sicuramente questo approccio perché IMO è necessario valutare l'utilizzo della gestione delle eccezioni. Puoi rilevare eccezioni in casi eccezionali se puoi fare qualcosa con quell'eccezione (cioè recuperare, persistere, riprovare, ecc.). Le eccezioni sono un'eccezione per il flusso di lavoro previsto, non una parte di esso.

1

il mio insegnante ha avuto una grande idea per un TryParse C# come metodo in java Spero che aiuta

import java.util.Scanner; 

public class Program { 
    static Scanner scanner = new Scanner(System.in); 
    public static void main(String[] args) { 
     System.out.println("Enter number"); 
     String input = scanner.next(); 
     int[] num ={0}; 
     if(tryParse(input,num)) 
      System.out.println(num[0] * num[0]); 
    } 
    static boolean tryParse(String inputString,int[] outputInt){ 
     try{ 
      outputInt[0] = Integer.parseInt(inputString); 
      return true; 
     }catch(Exception e){ 
      return false; 
     } 
    } 
} 
-2

inout parametri funzionano solo per gli oggetti che possono essere mutati. Per i parametri String inout, passare in StringBuilders anziché String, quindi sostituire() i loro valori.

2

IEEE Floating Point

maggior parte dei linguaggi gestirà il tuo esempio specifico senza eccezioni o tipi unione perché IEEE in virgola mobile include una rappresentazione per NaN. In Java, utilizzare Double.NaN:

public static double quadratic(double a, double b, double c, int polarity) { 
    double x = b*b - 4*a*c; 

    // When x < 0, Math.sqrt(x) retruns NaN 
    if (x < 0) { 
     return Double.NaN; 
    } 
    return (-b + Math.sqrt(x) * polarity)/(2*a); 
} 

che produce l'output esatto che si voleva:

x = 4.0 
x = 3.0 
x = NaN 
x = NaN 

eccezioni

Le eccezioni sono The Old Java modo di risolvere problemi simili:

public static double quadratic(double a, double b, double c, int polarity) { 
    double x = b*b - 4*a*c; 
    // When x < 0, Math.sqrt(x) returns NaN 
    if (x < 0) { 
     throw new Exception("NaN") 
    } 
    return (-b + Math.sqrt(x) * polarity)/(2*a); 
} 

Ecco il codice cliente per un'eccezione.

a=1; b=-7; c=12; 

// x = 4.0 
try { 
    System.out.println("x = " + quadratic(a, b, c, 1)); 
} catch (Exception iae) { 
    System.out.println("Oopsie: " + iae.getMessage()); 
} 

// x = 3.0 
try { 
    System.out.println("x = " + quadratic(a, b, c, -1)); 
} catch (Exception iae) { 
    System.out.println("Oopsie: " + iae.getMessage()); 
} 

// "invalid" coefficients. 
a=4; b=4; c=16; 

// Oopsie: NaN 
try { 
    System.out.println("x = " + quadratic(a, b, c, 1)); 
} catch (Exception iae) { 
    System.out.println("Oopsie: " + iae.getMessage()); 
} 

// Oopsie: NaN 
try { 
    System.out.println("x = " + quadratic(a, b, c, -1)); 
} catch (Exception iae) { 
    System.out.println("Oopsie: " + iae.getMessage()); 
} 

tipi unione

Per passare veramente o ritorno tipi non correlati o da un metodo, si vuole tipi dell'Unione che Java in realtà non supporta. Ma Paguro offre Union Types che può essere utilizzato in Java come questo (usando Or):

public static Or<Double,String> quadratic(double a, double b, 
              double c, int polarity) { 
    double x = b*b - 4*a*c; 

    // When x < 0, Math.sqrt(x) retruns NaN 
    if (x < 0) { 
     return Or.bad("NaN"); 
    } 
    return Or.good((-b + Math.sqrt(x) * polarity)/(2*a)); 
} 

@Test public void testQuadradic() { 
    double a, b, c; 
    a=1; b=-7; c=12; 

    // x = Good(4.0) 
    System.out.println("x = " + quadratic(a, b, c, 1)); 

    // x = 3.0 
    System.out.println(
      (String) quadratic(a, b, c, -1) 
        .match(good -> "x = " + good, 
          bad -> "Oopsie: " + bad)); 

    // "invalid" coefficients. 
    a=4; b=4; c=16; 

    // x = Bad("NaN") 
    System.out.println("x = " + quadratic(a, b, c, 1)); 

    // Oopsie: NaN 
    System.out.println(
      (String) quadratic(a, b, c, -1) 
        .match(good -> "x = " + good, 
          bad -> "Oopsie: " + bad)); 
} 

Conclusione

Per esempio specifico, basta usare Floating Point. Per una soluzione più generale, trovo i tipi di unione più utili di Eccezioni. È possibile utilizzare i tipi di unione come argomenti per un metodo che potrebbe richiedere due input diversi che non hanno un'interfaccia o un antenato comune. Sono anche più amichevoli alla programmazione funzionale.

-1

Direi che è possibile. Ma non direttamente.

Non ho eseguito il programma indicato nella domanda. Sto rispondendo sapendo che questo è un vecchio post. Potrebbe aiutare qualcuno.

Aggiungi i tuoi valori a una mappa come di seguito. E prendilo con la sua chiave!

public static HashMap returnAnyType(){ 
    String x = "This"; 
    int a = 9; 

    HashMap myMap = new HashMap(); 
    myMap.put("stringVal", x); 
    myMap.put("intVal", a); 
    return myMap; 
} 

String theStringFromTheMap = (String) returnAnyType().get("stringVal"); 
int theIntFromTheMap = (Integer) returnAnyType().get("intVal"); 

System.out.println("String : " + theStringFromTheMap + " is great !"); 
System.out.println("Integer: " + theIntFromTheMap + 10); 

uscita (entrambi sono tornati dalla stesso metodo):

 
String : This is great! 
Integer: 19 

Nota:
Questa non è una buona pratica. Ma a volte aiuta quando è necessario!

+0

Why down vote? Spiega per favore ! – smilyface

+0

Non ho fatto un downgrade, ma ho alcune domande/commenti: 1. Dovresti specificare i parametri di tipo per 'HashMap'. 2. Come si fanno le chiavi? –

Problemi correlati