정적 제네릭 메서드 호출


106

정적 제네릭 메서드와 관련된 흥미로운 상황을 발견했습니다. 다음은 코드입니다.

class Foo<E>
{
    public static <E> Foo<E> createFoo()
    {
        // ...
    }
}

class Bar<E>
{
    private Foo<E> member;

    public Bar()
    {
        member = Foo.createFoo();
    }
}

식에 유형 인수를 지정할 필요가없는 이유는 Foo.createFoo()무엇입니까? 이것은 일종의 유형 추론입니까? 이에 대해 명시 적으로 지정하려면 형식 인수를 어떻게 지정할 수 있습니까?


7
createFoo 메서드의 유형 매개 변수 E를 변경하는 것이 좋습니다. 왜냐하면 Foo 클래스의 유형 매개 변수 E는 createFoo () 메소드의 유형 매개 변수 E와 다르기 때문입니다.
Gursel Koca 2011 년

@GurselKoca 그는 명시 적으로 멤버 = Foo. <E> createFoo (); 컴파일 시간과 동일해야합니다.
George Xavier 19

답변:


183

예, 이것은 JLS 섹션 15.12.2.8 에 따라 할당 대상을 기반으로 한 유형 추론 입니다. 명시 적으로 말하면 다음과 같이 호출합니다.

Foo.<String>createFoo();

3
또는 제 경우처럼 : Foo.<E>createFoo();감사합니다 :)
fredoverflow 2011 년

7
이것이 할당 없이도 어떻게 작동합니까? 즉, 문장 Foo.createFoo(); 이 잘 컴파일됩니다 ...? 유형 삭제 때문인가요?
fredoverflow 2011 년

9
할당 E이 없는 @FredOverflow 는 "추론"될 수 있습니다.Object
평판이 좋지 않습니다.

2
새 링크 위치는 다음과 같습니다. docs.oracle.com/javase/specs/jls/se8/html/…
Joanis 2014

3
의 유형을 지정하는 다른 방법 E을 정의하는 것입니다 createFoo()유형의 인수를 Class<E>(이 될 수 있도록 createFoo(Class<E> type)), 그리고 그것을 호출createFoo(String.class)
개빈 S. 얀시
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.