Statik genel yöntemleri çağırma


106

Statik jenerik yöntemleri içeren ilginç bir durumla karşılaştım. Kod bu:

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

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

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

Neden ifadede herhangi bir tür bağımsız değişkeni belirtmem gerekmiyor Foo.createFoo()? Bu bir tür çıkarım mı? Bu konuda açık olmak istersem, tür bağımsız değişkenini nasıl belirtebilirim?


7
CreateFoo metodunun E tipi parametresini değiştirmenizi tavsiye ederim. Çünkü, Foo sınıfının E tipi parametresi, createFoo () yönteminin E tipi parametresinden farklıdır.
Gürsel Koca

@GurselKoca Açıkça üye = Foo yapabilir. <E> createFoo (); derleme zamanıyla aynı olmalarını gerektiriyor.
George Xavier

Yanıtlar:


183

Evet, bu, JLS bölüm 15.12.2.8'e göre atamanın hedefine dayalı tür çıkarımıdır . Açık olmak gerekirse, şöyle bir şey çağırırsınız:

Foo.<String>createFoo();

3
Veya benim durumumda olduğu gibi: Foo.<E>createFoo();Teşekkür ederim :)
fredoverflow

7
Bu nasıl olur da görev olmadan da çalışır? Yani, ifade Foo.createFoo(); gayet iyi derleniyor ...? Bu, tür silme işleminden mi kaynaklanıyor?
fredoverflow

9
@FredOverflow atamasız E"çıkarsama" olacaktırObject
alınamaz

2
Yeni bağlantı konumu muhtemelen şu şekilde olacaktır: docs.oracle.com/javase/specs/jls/se8/html/…
Joanis

3
Türünü belirlemenin farklı bir yolu, bir tür argümanı almak (öyle olacaktı ) Etanımlamak ve şununla adlandırmaktırcreateFoo()Class<E>createFoo(Class<E> type)createFoo(String.class)
Gavin S. Yancey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.