Викликання статичних родових методів


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
Я рекомендую вам змінити параметр типу E методу createFoo. Тому що параметр типу E класу Foo відрізняється від параметра типу E методу createFoo ().
Gursel Koca

@GurselKoca Він міг явно зробити member = Foo. <E> createFoo (); вимагаючи, щоб вони були такими ж, як час компіляції.
Джордж Ксав'є

Відповіді:


183

Так, це висновок типу, що базується на цілі завдання, відповідно до розділу JLS 15.12.2.8 . Щоб бути чітким, ви б назвали щось на зразок:

Foo.<String>createFoo();

3
Або, як у моєму випадку: Foo.<E>createFoo();Дякую :)
fredoverflow

7
Як це також працює без призначення? Тобто, твердження Foo.createFoo(); складається просто чудово ...? Це пов’язано з стиранням типу?
fredoverflow

9
@FredOverflow без присвоювання Eє «висновок» бутиObject
irreputable

2
Нове місце розташування посилання, ймовірно , буде: docs.oracle.com/javase/specs/jls/se8/html / ...
Joanis

3
Іншим способом вказати тип Eбуло б визначити createFoo()взяти аргумент типу Class<E>(так було б createFoo(Class<E> type)) і назвати його за допомогоюcreateFoo(String.class)
Гавін С. Янцей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.