2013-04-27 30 views
5

Tôi đang tìm một giải pháp đơn giản để chuyển các giá trị thuộc tính/đối tượng giữa hai chương trình java. Các chương trình giống hệt nhau (chạy trên các nút tách biệt) và không thể đặt/nhận các biến mặc dù gọi phương thức. Họ chỉ có thể giao tiếp thông qua kênh bên ngoài như tệp hoặc mạng. Có nhiều đối tượng khác nhau cần được chia sẻ. Ý tưởng của tôi là chuyển dữ liệu dưới dạng văn bản và mã hóa/giải mã bằng xml. Tôi cũng có thể gửi tên đối tượng và lớp của nó.Java, diễn viên năng động, giá trị truyền từ Object đến đối tượng của lớp đích

Vấn đề của tôi là: phương thức giải mã trả về các biến kiểu Object. Tôi đã di chuyển giá trị cho đối tượng đích nhưng không có cast Tôi nhận được lỗi biên dịch 'cast không tương thích'. Vì vậy, tôi đã làm một diễn viên. Nhưng có rất nhiều đối tượng có thể và tôi đã làm một tập hợp lớn nếu câu lệnh if hoặc switch. Tôi có tên của lớp và nó sẽ rất tốt đẹp để làm một số loại diễn viên năng động.

chủ đề này thảo luận về chủ đề tương tự và đề nghị sử dụng Class.cast() nhưng tôi đã không có thành công:

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

tôi bạn thích câu hỏi định hướng mã ở đây bạn là:

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 

Chúc mừng, Annie

+1

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

Trả lời

3

Nếu vấn đề của bạn là với hướng dẫn assign nhận xét trong vòng mẫu mã của bạn, bạn có thể triển khai một cái gì đó với generics:

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

Cách tiếp cận này có thể cho phép bạn làm điều gì đó như:

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 xin vui lòng cho một lời nhận xét về việc bỏ phiếu xuống ...;) tôi didn' Hãy lấy nó ... –

+0

Vâng, tại sao bỏ phiếu xuống? Đó là giải pháp đúng. –

+0

Ồ, đợi đã, bạn quên cung cấp lớp cho phương thức. Sửa đổi nó để bao gồm tham số 'Class c'. Nếu không, trình biên dịch không có cách nào để biết 'T' là gì cho một cuộc gọi cho phương thức. –

0

Bạn có thể sử dụng Generics:

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); 

Dĩ nhiên, phương pháp giải mã của bạn sẽ cần để làm điều gì đó hơn thế.

+0

bạn có thể sử dụng Lớp đã cho để thực hiện một diễn viên rõ ràng như sau: 'return c.cast (str);' bên trong phương thức giải mã. –

+0

... ngoại trừ lớp đã cho luôn là biểu diễn chuỗi, không phải là chính lớp đó. –

+0

Xin lỗi, tôi đã hiểu lầm. Trái ngược với dàn diễn viên tĩnh? Tại sao điều đó lại cần thiết? –

0

bạn có thể đi cho một cái gì đó như thế này

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

    return (T)(obj); 
} 



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

}