2013-03-17 3 views
2

소켓을 통해 개체 목록을 보내려고합니다.하위/하위/상속 된 클래스에서 기본/상위/상위 클래스 가져 오기

목록에있는 개체에는 직렬화 할 수없는 개체가 포함되어 있으므로 보낼 수는 없지만 기본 클래스는 완전히 serializable이며 필요한 모든 필드가 들어 있습니다.

그래서 내가하려는 것은 기본 클래스 목록으로 목록을 변환하는 것입니다. 내가 생각할 수있는 유일한 방법은 그래서 다음과 같이는 할 : 나는 여전히 같은 가지는 NotSerializableException 예외가로 이것은 그러나 작동하지 않습니다

// subClassList is an ArrayList<SubClass> 
ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>(); 
for(SubClass subClass: subClassList) { 
    // cast to the base class 
    baseClassList.add((BaseClass)subClass); 
} 

. 코드를 디버깅 한 결과 새 목록은 여전히 ​​캐스팅되었지만 하위 클래스의 목록임을 알 수 있습니다.

내가하려는 일을 성취 할 수있는 방법이 있습니까? 실제 개체의 형식이 변경되지 않는 참조를 캐스팅

답변

1

: 당신이 하려면

String foo = "hello"; 
Object bar = (Object) foo; 
System.out.println(bar); // Hello 
System.out.println(bar.getClass()); // java.lang.String 

기본 클래스의 인스턴스를 가지고, 당신은 기본 클래스의 생성자를 만들 수있는 당신이했습니다 코드 쇼에 그런

public BaseClass(BaseClass other) { 
    this.x = other.x; 
    this.y = other.y; 
    this.z = other.z; 
    // etc 
} 

: 단순히 딥 카피의 어떤 종류를 수행하려는없이 인스턴스, 주어진 기본 클래스의 새 인스턴스를 생성 여기서 n은 :

baseClass.add(new BaseClass(subClass)); 
0

는 서브 클래스 객체를 참조하는 수퍼 클래스 변수를 사용할 수 있지만 있기 때문에 귀하의 접근 방식은 작동하지 않습니다, 개체 자체는 서브 클래스 타입이다.

가장 좋은 방법은 하위 클래스를 직렬화하거나 하위 클래스에서 데이터를 추출하여 새로 만든 수퍼 클래스에 쓰는 것입니다. 하위 클래스로 변환 빌드를 수행하는 정적 유틸리티 메서드가 있습니다 ....

0

캐스팅은 개체 유형을 변경하지 않습니다. 객체가이 다른 유형을 가진 경우 객체의 다른 유형에 대한 참조를 가져올 수 있습니다. 추방은 결코 필요하지 않습니다.

Object o = "hello"; 
Object o2 = Integer.valueOf(5); 
String s = (String) o; // OK because o is a String 
String s2 = (String) o2; // ClassCastException, because o2 is not a String. 

그래서, 코드가

ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>(); 
for(SubClass subClass: subClassList) { 
    // cast to the base class 
    baseClassList.add(subClass); 
} 

에 해당 : 당신은 객체 유형을 경우 당신이 캐스팅

String s = "hello"; 
Object o = s; // no cast needed 

Downcasting이 필요 사용할 수 있으며에만 작동합니다 복사 생성자를 사용하여 새 유형의 새 객체를 만들어야합니다.

ArrayList<BaseClass> baseClassList = new ArrayList<BaseClass>(); 
for(SubClass subClass: subClassList) { 
    // cast to the base class 
    baseClassList.add(new BaseClass(subClass)); 
} 
0

귀하의 질문은 모순을 구체화합니다. 기본 클래스가 Serializable이면 모든 파생 클래스가 있습니다. 파생 클래스에 직렬화 할 수없는 객체에 대한 참조가 포함되어 있으면 해당 객체를 일시적으로 변경하면됩니다.

관련 문제