2016-07-04 1 views
2

Ich brauche ein Verfahren funktionell ähnlich den folgenden implementieren:Wie bekomme ich den Typ-Namen in einem generischen Methodenaufruf übergeben?

static <T extends Object> T validateObj (T obj) throws ValidationException { 
    // ValidationException is a custom Exception class 
    if (obj == null) { 
    throw new ValidationException(T.class.getSimpleName() + errorMsgTemplate); 
    } else { 
    return obj; 
    } 
} 

Ein Beispiel dafür, wie die Funktion, die durch das System verwendet wird:

try { 
    RandomAccessFile file = getFile(pathName, "r"); // Custom method. May return null 
    file = Validator.validateObj(file); 
} catch (Exception e) { 
    // Handle exception 
} 
// Use file 

Bei dem Versuch, Fehler zu protokollieren, wie kann ich erhalten, der Klassenname von T für jeden bestimmten Methodenaufruf, unabhängig davon, ob das übergebene tatsächliche Objekt null ist oder nicht? Der Typ der Objektvariable, die an die Validierungsmethode übergeben werden soll, ist der Methode caller immer bekannt.

Update: Während ich Bambino's Antwort wählte, hier ist ein Shoutout zu StuPointerException's Antwort. Aufgrund der Einschränkungen beim Umgang mit bestehendem Code ist seine Antwort eher für mein spezifisches Problem geeignet. Ich glaube jedoch, dass die Antwort von Bambino die korrektere Implementierungslösung im Allgemeinen ist.

Antwort

0

Wenn Sie eine generische Methode des Formulars haben

static <T> T validateObj(T obj) { 
    // code 
} 

dann die Art der T durch die Klasse des Objekts bestimmt werden Sie in übergeben. Das heißt, T immer genau die Art von dem, was Sie übergeben. Das heißt, Sie können obj.getClass() aufrufen, um die Klasse zu erhalten, solange es nicht null ist. Wenn Sie null übergeben, behandelt es T als wäre es Object.

1

Dies ist nicht möglich Ich habe Angst; getClass gibt die Klasse des Objekts zurück. Wenn Sie null haben, haben Sie kein Objekt, so dass Sie den Typ nicht erhalten können.

Ein Weg, yo dieses Problem umgehen, ist es, den Anrufer zu zwingen, einen Verweis auf die Klasse gehören, dass sie (oder auch sein mag) pass:

static <T extends Object> T validateObj (T obj, Class<?> clazz) throws ValidationException {

+0

Hmm, also meinen Sie den Klassennamen von außen zu übergeben? Irgendeine Idee, wenn Sie es auf Ihre Art tun oder einen String-Wert von 'simpleName()' übergeben, ist besser in Bezug auf die Belastung der Overheads, oder ist es egal? – thegreatjedi

+0

Pass auf jeden Fall die 'Klasse' auf, dies ist ein Standardmuster um solche Szenarien zu umgehen. Es gibt nur minimale Gemeinkosten. – StuPointerException

+0

Ok, vielen Dank – thegreatjedi

Verwandte Themen