2016-03-27 20 views
0

Bir C++ arka planından geldiğimde, uygulama sırasında nesne oluşturma yoluyla gerek duymaksızın kullanılabilecek birkaç statik yöntem kullanmayı umuyordum. Java Generics'te fonksiyon şablonlarının denkliğini kullanmayı umuyordum. Bu noktada, Java jeneriklerini öğrendiğimi açıklığa kavuşturmak istiyorum.Java Generics - Tip bağımsız değişkenlerle statik yöntemler nasıl yazılır?

Ama bunu denerken, derleyicinin bunu yapmama izin vermeyeceğini görebiliyordum. Ve ben very good discussion as well here'u görebiliyordum. Ama sonra benzer bir dokunuşla bir iç statik sınıf yazmak için uyarı mesajıyla etrafta oynadım ve sezgilerime göre orada çalıştı. Şimdi açıkçası, aşağıda sunduğum iç sınıflara erişmek beceriksiz. Bunun neden bu şekilde Java'da tasarlandığını ve bu iç sınıfın jeneriklerle dış sınıflara sunacağını merak ediyorum.

public class ReflectionBasics<X, Y> { 

    public static void findMax (X xData, Y yData){ 
     // compiler error - cannot reference static type to non-static type X 
    } 

    public void findMin(X xData, Y yData){ 
     // this is fine 
    } 

    static final class InnerClass<E> { 
     public void findMin(E data){ 
      // this will work 
     } 
    } 
} 

Sakar Erişimci: Bir yöntem üzerinde tür parametreleri koymak istiyorsanız

class AccessorClass{ 
    AccessorClass(){ 
     ReflectionBasics.InnerClass<Integer> myData = new ReflectionBasics.InnerClass<Integer>(); 
     myData.findMin(400); 

    } 
} 
+2

https://docs.oracle.com/javase/tutorial/java/generics/methods.html Java'nın genel yöntemleri vardır. Ayrıca, Java jeneriklerinin şablon olmadığını ve C++ şablonlarının yapabileceği pek çok şey yapamayacağını unutmayın. (Öte yandan, C++ şablonlarının * yapamadıkları birkaç şeyi yapabilirler.) – Radiodef

cevap

1

, sadece (muhtemelen void olmak istemiyordu olan) dönüş türü önce onları sopa:

public static <T extends Comparable<T>> T findMax(T a, T b) { 
    ... 
} 

çoğu durumda, çağrı yerinde tipi parametrelerini atlayabilirsiniz ve onlar sizin için çıkarılabilir olacak:

Integer max = WhateverClass.findMax(integerA, integerB); 
+0

Doğru bildirim, 'public static > void findMax (T a, T b) {' – fRoStBiT

+0

@ fRoStBiT: Bah, bu garip sözdizimini bellekten yeniden üretmeye çalıştığım şey. Bu parametreye bağlı olabilen, dönüş türünden önce tip parametresini tanıtmak mantıklıdır. – user2357112

+0

@fRoStBiT - Sorguma bir notu yanıtladığınız için teşekkür ederim. Ayrıca bu soruya oy verenlere teşekkür ediyorum, ancak düşünce sürecine gerçekten acıyorum. Bu soru zaten onun için değildi. Eminim ki benim gibi birçok yeni java programcısı böyle bir soruya sahip olacak. Birçok insanın cevabı bilmediğini söyleyebilirim. Cevap veren ilk kişi 58.9 bin kişilik ve 26. ziyaretçi olan kişiydi. – Suparna

İlgili konular