2013-06-24 3 views
1

부모 클래스와 여러 개의 하위 클래스가 있습니다 (parentchild1, child2, child3 등).자바의 하위 클래스 변수에 부모 클래스 할당

I는 parents의 2-D 배열을 취하고이 같은 1-D 어레이에 평탄화 함수가 : 호출 컨텍스트의

public parent[] flatten(parent[][] input); 

를, I는 알고 I 배열을 전달할 때 모든 요소는 같은 유형이며, 그 유형은 하위 유형 중 하나입니다 (특히, 나는 그것이 어떤 하위 유형인지 압니다).

child1 c = flatten(input)[0]; 

내가 (관련 SO 게시물 : Assert an object is a specific type를) 타입의 주장에 대해 알고 : 나는 배열의 특정 요소를 가지고,이 같은 적절한 하위 유형의 변수에 할당 할 수 있도록하려면,하지만 어설 션이 성공하면 올바르게 유형화 된 변수에 실제로 할당하는 방법을 찾지 못하는 것 같습니다. 자바에서도 그런 일이 가능한가? 다른 언어 (예 : 이동)에서도 가능하다는 것을 알고 있습니다.

답변

1

할 수 있습니다하지 allocate generic arrays,하지만 당신은 당신을 위해 주조 돌봐 제네릭을 사용할 수있는 아웃 PARAM 전달하고자하는 경우 :

public <T extends Parent> boolean addAll(T[][] input, 
              T[] output) { 
    //set up you indices 
    output[x] = input[z]; 
    return true; 
} 

을 당신이 전달하는 경우 타의 추종을 불허하는 입/출력을하면 런타임 오류가 발생합니다. 그렇지 않으면 정상적으로 작동합니다.

1

정말 하위 유형에 할당 하시겠습니까? 메소드가 Parent 클래스에 정의되어있는 경우 클래스 참조로 작업하여 Child 클래스 메소드에 액세스 할 수 있습니다. 당신은 유형 만 child1입니다 있는지 확인해야

child1 c = (child1)flatten(input)[0]; 

을하지만 : 그렇지

, 당신은 적절한 유형에 캐스트를 입력 할 수 있습니다. 일반적으로 타입 캐스팅은 좋은 생각이 아닙니다. 그것은 나쁜 코드의 표시입니다 (그러나 항상 그런 것은 아닙니다). 가능한 한 많이 피하려고 노력해야합니다. 이 같은

+0

내가 타입 변환 (typecast)하면 틀릴 것입니다. 이 경우에는 발생하지 않습니다. 나는 단지 궁금하다. – joshlf

+0

런타임시 ClassCastException을 발생시킵니다. 여기서 일어날 일이 아니라고 확신한다면 괜찮습니다. 그러나 이런 종류의 주조를 피하는 것은 일반적인 아이디어 일뿐입니다. –

+0

음, 괜찮아. 나의 참조는 Go이고, 타입 캐스트는 컴파일 타임에 정확해야하고, 타입 어설 션 (별도의 언어 구조)은 런타임까지는 입증 될 수없는 캐스트에 사용됩니다. – joshlf

1

시도 "캐스팅":

Child1 c = (Parent)flatten(input)[0];