2016-11-23 20 views
6

Neden aşağıdaki derleme var? Bana buBu neden derleniyor? Türü silme

getTest anlatan bir uyarı olsun()

silinir getTestIntegers böylece ham türü() döndürür Ama getTestIntegers() jenerik değil neden anlamıyorum. Ben Az önce belirtildiği bir derleme hatayı

public class Scratchpad { 

    public static void main(String[] args) { 
     new Scratchpad().run(); 
    } 

    private void run() { 
     List<String> tester = Test.getTest().getTestIntegers(); 
    } 

    private static class Test<T> { 

     public static Test getTest() { 
      return new Test(); 
     } 

     public List<Integer> getTestIntegers() { 
      return Collections.singletonList(1); 
     } 
    } 
} 
+2

uyarı söylediği gibi ham türü 'sına döndüren getTest' yöntem'. Bunu yapmamalı; Bu yönteme bir tür parametresi eklemelisiniz. Ham türleri kullandığınızda, derleyici geriye dönük uyumluluk moduna girer ve işler beklediğiniz gibi çalışmaz. Bakınız: [Ham tip nedir ve neden kullanmamalıyız?] (Http://stackoverflow.com/questions/2770321/what-is-a-raw-type-and-why-shouldnt-we-use -it) – Jesper

+0

Bağlantı için teşekkürler, "Bir tür, bu tür bir silme" ile ilgilidir "fırsatlar" ve açıkça JLS içinde. Ama anlamadığım şey neden? GetTestIntegers() 'i silmeye gerek duymanın gerekçesi nedir? –

cevap

2

üretmek için List<String> tester = Test.getTest().getTestIntegers() beklerdik, getTest ham tip döner. Yöntemin doğru bir uygulama aşağıdaki gibi görünecektir:

Statik yöntemleri için genel bir parametre belirtmeniz gerekir
public static <T> Test<T> getTest() { 
    return new Test<>(); 
} 

Not - bu sınıf imzasında olarak değil aynı T olduğu gibi, herhangi bir şey olabilir (ama aynı yerde kullanılırsa aynı ismi kullanmak oldukça normaldir).

Öyleyse, derleyicinin doğru türden çıkarım yapmasına bağlı olabilir, bazen "yardım "ınıza ihtiyaç duyabilir, örn.

List<String> tester = Test.<String>getTest().getTestIntegers(); 

(bu orada gerekli olup olmadığını denemek vermedi, ama bu böyle görünüyor)

İlgili konular