2016-02-05 16 views
7

Aşağıdaki kod JDK7'de javac kullanarak her iki test yöntemini derler ancak JDK8 yalnızca willCompile yöntemini derler.Java 7'den Java 8'e geçiş - derleme hatası

willNotcompile için hatadır: "Klasa bağımsız değişken (Class) için geçerli değildir türü yöntem method (Class<T>)."

@Test 
public void willCompile() throws InstantiationException, IllegalAccessException { 
    Class klass = getObject(Class.class); 
    method(klass); 
} 

@Test 
public void willNotCompile() throws InstantiationException, IllegalAccessException { 
    method(getObject(Class.class)); 
} 

<T> ResponseEntity<T> method (Class<T> klasa) { 
    return new ResponseEntity<T>(HttpStatus.OK); 
} 
public static <T> T getObject(Class<T> clazz) throws IllegalAccessException, InstantiationException { 
    return clazz.newInstance(); 
} 
+1

'willCompile()' rawtype kullanıyor, bu yalnızca eski kod için destekleniyor – Ferrybig

+2

[Ham tür nedir ve neden kullanmamalıyız?] (Http://stackoverflow.com/questions/2770321/ ne-is-a-tür-ve-neden-değil-biz-use-it) – Tunaki

+1

[iç içe geçmiş çağırma ve ham türleri hedefleme] (http://stackoverflow.com/a/26285613/2711488) – Holger

cevap

5

HamTypes kullandığı için yukarıdaki derlemeler.

En alttaki yöntem, yönteminizin yalnızca Class<T> kabul ettiği için değil, Class verdi. Yansıma kullanarak, bir sınıfın genel türlerini belirleyemezsiniz, bu nedenle getObject bir ham Sınıf nesnesini döndürür.

Sorun için tek çözüm, sonuçların döndürülmesidir.

method((Class<?>)getObject(Class.class)); 

Ama bu çözüm yine de Class yeni örneklerini oluşturamazsınız gerçeği ile ilgili sorunlar olsun çalışma zamanı sorunu çözer iken. Bu karşılaştırmada daha az sıkı olan JDK 7, Class geri dönüş sonucunu, kodun derlenmesine izin verilebilmesi için sahne arkasında bir Class<?> içine döktü.

Holger göre JDK 7 bütün hatlar için jenerik tipte kapatır ve bu yöntem, bir Class alır ve ResponseEntity döner, yani dönüş sonucu ham türleri kullanır.

+0

Doğru, getObject() 'ham Class nesnesini değil, bazı nesnelerin örneğini döndürmesi gerçeğinden ayrıdır. Bu yüzden derleme iyi olsa da (en azından uyarı vermeniz gerekir), çalışma zamanında herhangi bir zamanda başarısız olur. –

+0

teşekkürler. Sınıfın yeni bir örneğini oluşturamayacağınızı biliyorum (istisna atar), ancak çalışma zamanı olmayan derleme kurallarını kontrol etmek için hızlı bir uygulama oldu. – user3364192

+1

Aslında, Java 7 'Class'ı' Class ''üne çevirmedi, tüm ifade için genel tip denetimini, işlem boyunca ham türleri kullanarak kapattı. Bu nedenle, giriş ham tür olduğunda sonraki kullanımda daha genel hatalarla daha da uzaklaşabilirsiniz. – Holger