위리윗
692
2019-11-25 16:22:25
4
561

java invoke함수 사용 질문


안녕하세요

함수 호출시 이해가 안되는 부분이 있어 질문 올려봅니다.


class A {
~
}

class B extends A {
~
}

class Sequence<T>{
~
}

class C{
    public functionTest(Sequence<B>){
    ~
    }
}

main(){
 C testC = new C();
 Sequence<A> testA = new Sequence<A>();
 functionTest(testA);
}

먼저 위와 같이 작성할 경우 전달인자 type이 다르기 때문에 오류가 발생합니다.

자식 객체에 부모 객체를 넣을 수 없으니까요.


그런데 이를 invoke로 작성하면 정상적으로 함수를 호출하고 전달하는데 오류가 나야하는것 아닌지... 이해가 잘 가질 않습니다. 조언 좀 부탁드립니다. ㅠㅠ

C testC = new C();
Sequence<A> testA = new Sequence<A>();
testC.getClass().getMethod("functionTest", new Class[]{Sequence.class}).
invoke(testC, new Object[]{testA});



0
  • 답변 4

  • asd
    16k
    2019-11-25 17:28:00

    제네릭은 컴파일타임에만 타입안정성을 체크할 수 있습니다.

    리플렉션은 동적으로 메서드를 가져와서 호출하므로 그때는 타입을 체크하지못하죠.

    리플렉션까지 안가고 정상적으로 호출하려면 공변을 이용하면 됩니다.

    public functionTest(Sequence<? extends A>){}

  • 위리윗
    692
    2019-11-26 09:47:16

    LichKing 

    먼저 시간내어 조언주셔서 정말 감사합니다.

    조언해 주신부분을 읽고 아래와 같이

    [제네릭과 리플렉션의 타입안정성 체크 시기가 서로 달라 오류를 피해갈 수 있다.]

    로 이해하였습니다만 맞게 이해한걸까요?

  • asd
    16k
    2019-11-26 10:02:11

    리플렉션은 타입안정성 체크가 없고요.

    제네릭은 그 자체가 타입안정성을 보장하기위해 사용하는 기술인데 이 기술의 유효범위가 컴파일 타임입니다.

    리플렉션은 컴파일이 된 후 런타임에 functionTest 를 가져오게되고 그때는 Sequence<B> 를 받는다는걸 보장할수없기때문에 Sequence<A> 가 들어가도 문제없이 실행되는겁니다.

  • 위리윗
    692
    2019-11-26 12:57:05

    LichKing

    설명해주셔서 정말 감사합니다.

    정말 큰 도움이 되었습니다!

  • 로그인을 하시면 답변 을 등록할 수 있습니다.