Soru Statik olmayan yöntem, java 8 akışlarında statik bir bağlamdan referans alınamaz.


İle örneklerle uğraşıyordum http://www.concretepage.com/java/jdk-8/java-8-unaryoperator-binaryoperator-example.

Gerçekten kafa karıştırıcı bulduğum şey, Koleksiyonerler oluşturulurken yanlışlıkla bir yanlış tip yazdığımda, java derleyicisi bana çok yanıltıcı bir mesaj veriyor:

Statik olmayan bir yöntem statik olmayan bir yöntemden referans alınamaz.

Benim hatamın gerçekte statik vs örnek bağlamı ile ilgisi yoktur:

Map<String, Map<Integer, Integer>> mapOfStudents = list.stream().collect(Collectors.groupingBy(Student::getClassName,
            Collectors.toMap(Student::getName, Student::getAge)));

Benim hatam jenerik dönüş tipindedir. Düzeltdiğimde ve koyduğumda:

Map<String, Map<String, Integer>> mapOfStudents

her şey normale döner.

Birisi böyle kafa karıştırıcı bir hata mesajının arkasındaki sebebini açıklayabilir mi? Eminim ki iyi bir tane ama anlayamıyorum.

DÜZENLE:

~$ java -version
openjdk version "1.8.0_121"
OpenJDK Runtime Environment (build 1.8.0_121-8u121-b13-0ubuntu1.16.04.2-b13)
OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode)

19
2018-02-13 09:43


Menşei


İle çok farklı bir mesaj alıyorum javac (çok daha net). Yöntem referansları / lambdas kullanırken Eclipse'de de benzer şekilde hatalı hata mesajlarına sahip olmama rağmen. - Jorn Vernee
Lütfen, tür çıkarımı oldukça sık değişen şeylerden biri olduğundan, java derleyicisinin tam sürümünü ve sürümünü sağlayın. - biziclop
Detaylar için Düzenle bölümüne bakınız. Intellij Idea 2016.3'ü çalıştırıyorum. - yuranos87
Benzer mesajı not edin İşte. - shmosel
@JornVernee, Eclipse'de kötü bir mesaj için örnek verebilir misiniz? Bu örnekte, Eclipse (head) şöyle der: "Eşleşmeyen eşleme: Harita <String, Eşleme <String, Tamsayı> <String </ a0>, <Tamsayı, Tamsayı </ strong> </ strong> </ strong> </ a0>, bana göre çok iyi görünüyor. - Stephan Herrmann


Cevaplar:


Öncelikle, mesajın java derleyicisi (javac) tarafından değil IntelliJ IDEA tarafından verildiği belirtilmelidir. Gerçekte bir oluşturma işlemini başlattığınızda "Mesaj Oluşturma" penceresinde javac mesajlarını görebilirsiniz. Editör penceresinde gördüğünüz, IDEA tarafından üretilen mesajlardır ve bunlar farklı olabilir.

IntelliJ IDEA'da yöntem referans çözünürlüğünün uygulanması nedeniyle hata mesajı yanıltıcıdır. Statik olmayan metot referansının sadece ilgili SAM (tek soyut metod) argümanlarının sayısı, metod argümanlarının sayısı artı bire eşit olması durumunda çözüleceğini düşünür. ve ilk SAM argüman türü, sınıf içeren yöntemle uyumludur. Görmek hayata geçirme (Ayrıca isSecondSearchPossible Yukarıdaki yöntemde, varargs yöntemleri için bazı ek sihir gerçekleştirilir).

Programınızda hata yoksa doğru çalışır. Ancak, eşleşmeyen bir tür varsa, genel argümanları Function içine geçti toMap ikame edilemez, bu yüzden kalır Function<T, R>, ve Onun apply yöntem ilk argümanı basitçe T hangi türüne karşılık gelmez Student. Bu nedenle "ikinci arama" denen şey başarısız olur ve IDEA yöntemin statik bağlamdan kaynaklandığını düşünür. Statik ve statik olmayan bağlamlar burada geçerli olmasa da, statik olmayan bağlam, yönteminizle en azından, argümanların sayısına göre daha iyi eşleşir. getName() yöntem hiçbir argüman almaz. Öte yandan, IDEA mantığı "statik olmayan bir bağlam mevcut değilse, o zaman bu statik bir bağlamdır", dolayısıyla hata mesajıdır.

Bunu bir hata olarak ya da en azından bir kullanılabilirlik problemi olarak düşünürdüm. Ben yeni kaydettim İşte dayalı benzer soru. Umarım bunu düzeltiriz.

Yasal Uyarı: Ben IntelliJ IDEA geliştiricisi.

Güncelleştirme: IDEA 2017.2'de düzeltildi.


26
2018-02-15 03:02



Eğer kabul etmiyorsa javac bu bir böcek. - user207421
@EJP, programın yanlış olduğunu kabul eder, ancak hata mesajı farklıdır. Java dil belirtimi, doğru programın ne olduğunu belirtir, ancak hata iletilerinin yanlış programlara nasıl bakması gerektiğini tam olarak belirtmez. Eclipse derleyicisindeki hata mesajlarının da farklı olduğunu ve bu durumda fiili hatayı daha kolay tespit edebilmek için javac mesajlarından daha da iyi olduğunu unutmayın. Bunu Eclipse derleyicisinde bir hata olarak düşünür müsünüz? :-) - Tagir Valeev
Bana göre, "statik olmayan ve statik referanslar", "genel türlerin eşleşmediği" konusundan çok uzak. - lwpro2