2015-05-20 19 views
13

Bu kodu vardır: Tarih Listesi arayüzünün uygulamıyor çünküJava Jenerik: Çoklu Sınırlar

public class Test { 

    public static void main(String[] args) { 
     Test t = new Test(); 
     t.callTest(); 
    } 

    public void callTest() { 
     GenericTest gt = new GenericTest<Date>(); // this line don't compile 
     gt.test(new Date()); 
    } 

    class GenericTest<T extends Date & List> { 
     T x; 

     public void test(T y) { 
      System.out.println(x.toString()); 
     } 
    } 
} 

new GenericTest<Date>() derleme değil anlıyorum, öyle, ama genel, bütün olmadan GenericTest gt = new GenericTest() örneğini ise Kod çalışır ve neden anlamıyorum. Yöntem sınaması,T extends Date ve List uygular, ancak gt.test(new Date()) ile çalışır.

cevap

16

böyle örneğini zaman:

GenericTest gt = new GenericTest() 

Eğer GenericTest tip ham sürümünü kullanın. Bu, T türünün ilk ciltlemeyle değiştirileceği anlamına gelir (sizin durumunuzda, Date). Bu nedenle, GenericTest#test() yöntem sözleşmesinin bir Date parametresi vardır, ancak bir List tanesi yoktur.

Birincisi hariç her sınırın bir arabirim olması gerektiğini unutmayın. Yalnızca ilk cilt , sınıfında olabilir. Bunun nedeni, daha çok bir süper sınıftan miras kalan türlere sahip olmanın mümkün olmamasıdır.

Yani sadece birinci parametresi bir sınıf olduğundan, sen anahtarı tip parametreler mümkün olmayacak ve aşağıdaki sınıf tanımı geçersiz olacaktır:

class GenericTest<T extends List & Date> { } 
+0

Ham türleri kullandığınızda sınırlar gerçekten önemlidir mi? – CKing

+1

Evet, önemliydi. Eğer sadece '(yani sınırsız tip parametresi) varsa, o zaman değiştirme 'Object' olacaktır, ancak eğer'

+1

Haklısınız. İlk sınır uygulanır. Sadece denedim. +1 – CKing

-2

bir jenerik oluşturursanız jenerik parametreler olmayan sınıf örneği, derleyici bir uyarı verir ve oluşturulan örneğin kullanımını kontrol etmez. Kodun neden jenerik tür bildirmeden çalıştığıyla ilgili olarak - bu durumda T'nin Object olduğu varsayılır, bu herhangi bir tür iyidir

+0

'T'nin Object' olduğu kabul edilir. Bunun yanlış olduğuna inanıyorum. @kocko cevabına bakın – CKing