SORU
14 NİSAN 2014, PAZARTESİ


Neden bu Java 8 program derleme değil mi?

Bu program Java 7 iyi (veya -source 7 Java 8'de) derler, ama Java 8 ile derleme başarısız:

interface Iface<T> {}
class Impl implements Iface<Impl> {}

class Acceptor<T extends Iface<T>> {
    public Acceptor(T obj) {}
}

public class Main {
    public static void main(String[] args) {
        Acceptor<?> acceptor = new Acceptor<>(new Impl());
    }
}

Sonuç:

Main.java:10: error: incompatible types: cannot infer type arguments for Acceptor<>
        Acceptor<?> acceptor = new Acceptor<>(new Impl());
                                           ^
    reason: inference variable T has incompatible bounds
      equality constraints: Impl
      upper bounds: Iface<CAP#1>,Iface<T>
  where T is a type-variable:
    T extends Iface<T> declared in class Acceptor
  where CAP#1 is a fresh type-variable:
    CAP#1 extends Iface<CAP#1> from capture of ?
1 error

Diğer bir deyişle, bu birgeriye doğrukaynak Java 7 ve 8 arasında uyumsuzluk. Incompatibilities between Java SE 8 and Java SE 7 liste yaşadım ama benim sorunum uyabilecek bir şey bulunmadı.

Bu bir hata değildir?

Çevre:

$ /usr/lib/jvm/java-8-oracle/bin/java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

CEVAP
14 NİSAN 2014, PAZARTESİ


Java Dil Şartnamesi ile ilgili olarak önemli ölçüde değiştitür kesmesi. JLS7,tür kesmesi§15.12.2.7 §15.12.2.8, JLS8, içeride ise açıklanan tüm bir Bölüm Chapter 18. Type Inference adanmıştır.

Kurallar oldukça karmaşık, JLS7 ve JLS8 hem de. Zor farklar belli değil, ama belli ki bölüm bellidir §18.5.2 gibi farklılıklar vardır:

Bu çıkarım stratejisi Java Dil Şartnamesi Java SE 7 Sürümü [ .. ] daha farklıdır.

Ancak, değişim niyeti geriye doğru uyumlu olacak. Bölümün son paragraf §18.5.2 bkz

[..] Bu strateji Tipik kullanım durumları makul sonuçlar verir ve geriye Java Dil Şartnamesi Java SE 7 Sürümü algoritması ile uyumludur.

Bunun doğru olup olmadığını söyleyemem. Ancak, sorun görünmüyor kodunuzu, bazı ilginç farklılıklar vardır. Örneğin, aşağıdaki deyim, hatasız derler:

new Acceptor<>(new Impl());

Bu durumda, hayırhedef türü. Anlamına gelirSınıf Örneği İfade Oluşturunbir değildirpoly ifadelerve kurallar içintür kesmesivardır basit. §18.5.2 bkz

Eğer çağırma poli bir ifade değil, bağlı B grubu edelim3B aynı olacak2.

Bu da aşağıdaki ifadeyi çalışıyor sebebi.

Acceptor<?> acceptor = (Acceptor<?>) new Acceptor<>(new Impl());

İfadesi bağlamında bir tür olmasına rağmen, sayılmazhedef türü. Bir eğersınıf örneği oluşturma deyimya bir durum değilatama ifadesiya da birçağırma ifadesio zaman bir olamazpoly ifade. §15.9 bkz

Bir sınıf örneği oluşturma deyim bir poli ifade (§15,2 ve eğer kullandığı elmas formu için tür bağımsız değişkenleri için bir sınıf, ve görünür bir atama bağlam ya da bir çağırma içerik (madde 5.2, Madde 5.3). Aksi takdirde, tek başına bir ifadesidir.

İfadeni geri geliyor. Bu JLS8 ilgili bölümü yine §18.5.2. Ancak, eğer aşağıdaki beyanı doğru olup olmadığını söyleyemem hata mesajı ile JLS8, eğer derleyici doğru olup olmadığını göre. Ama en azından, daha fazla bilgi için bazı alternatifler ve işaretçiler var.

Acceptor<?> acceptor = new Acceptor<>(new Impl());

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Djbasilio AuToBaSs

    Djbasilio Au

    20 Aralık 2008
  • Elly Awesome

    Elly Awesome

    15 ŞUBAT 2010
  • WiseOwlTutorials

    WiseOwlTutor

    21 EKİM 2011