2013-04-27 11 views
5

Szukam prostego rozwiązania do przekazywania wartości atrybutów/obiektów między dwoma programami java. Programy są identyczne (działające na oddzielnych węzłach) i nie mogą ustawiać/pobierać zmiennych za pomocą wywołania metody. Mogą komunikować się tylko za pośrednictwem zewnętrznego kanału, takiego jak plik lub sieć. Istnieje wiele różnych obiektów, które powinny być udostępniane. Moim pomysłem jest przekazanie danych jako tekstu i kodowanie/dekodowanie za pomocą xml. Mogę też wysłać nazwę obiektu i jego klasę.Java, dynamiczne rzutowanie, przekazywanie wartości z obiektu do obiektu docelowego Klasa

Mój problem: metoda dekodowania zwraca zmienne typu Object. Muszę przenieść wartość do obiektu docelowego, ale bez rzutowania otrzymuję komunikat "niezgodna obsada" kompilatora. Więc muszę wykonać obsadę. Ale istnieje wiele możliwych obiektów i muszę zrobić ogromny zestaw instrukcji if lub switch. Mam nazwę klasy i byłoby miło zrobić jakąś dynamiczną obsadę.

Wątek dyskutować podobny temat i sugerują użycie Class.cast(), ale nie mam sukcesu:

java: how can i do dynamic casting of a variable from one type to another?

ja wolisz tutaj kod zorientowany pytanie jesteś:

Object decode(String str) 
    { 
    return(str); 
    } 

    String in = "abc"; 
    String out; 

// out = decode(in);   // compiler error 'incompatible types' 
// out = (String)decode(in); // normal cast but I'm looking for dynamic one 
// out = ('String')decode(in); // it would be perfect 

Cheers, Annie

+1

http://www.tutorialspoint.com/java/java_serialization.htm –

Odpowiedz

3

Jeśli problem jest z instrukcją przypisać skomentował zasięgu próbka kodu, możesz zaimplementować coś z rodzajami:

public <T> T decode(String str) { 
    ... decode logic 
    return (T)decodedObject; 
} 

Takie podejście może pozwolić zrobić coś takiego:

public void foo1(String bar) { 
    String s = decode(par); 
} 

public void foo2(String bar) { 
    Integer s = decode(par); 
} 

<T> T decode(String serializedRepresentation) { 
    Object inflatedObject; 

    // logic to unserialize object 

    return (T)inflatedObject; 
} 
+0

Ohhhh daj komentarz odnośnie głosowania w dół ...;) I nie zrobił” t get it ... –

+0

Tak, dlaczego głosowanie w dół? To właściwe rozwiązanie. –

+0

Och, czekaj, zapomniałeś podać klasie metodę. Zmień, aby zawierał parametr "Class c'. W przeciwnym razie kompilator nie ma możliwości poznania, czym jest "T" dla danego wywołania metody. –

0

Można używać rodzajowych:

public static <T> T decode(Class<T> c, String str) { 
    return (T)str; 
} 

...

Class<?> c = Class.forName(className); // throws CNFE 
out = decode(String.class, in); 

Oczywiście metoda dekodowania musiałyby zrobić coś więcej.

+0

można użyć danej klasy do wykonania jawnej obsady, takiej jak ta: 'return c.cast (str);' metoda dekodowania. –

+0

... poza tą daną klasą zawsze jest reprezentacja String, a nie sama klasa. –

+0

Przepraszam, źle mnie zrozumiałem. W przeciwieństwie do statycznej obsady? Dlaczego jest to potrzebne? –

0

można pójść na coś takiego

public static <T> T decode(T obj) { 

    return (T)(obj); 
} 



public static void main(String [] args){ 
    Integer int1 = decode(123); 
    String str1 = decode("abc"); 

} 
Powiązane problemy