2009-12-06 3 views
20

Comment écrire un équivalent de ceci en Java?Comment créer une classe Java, similaire à une classe de modèle C++?

// C++ Code 

template< class T > 
class SomeClass 
{ 
private: 
    T data; 

public: 
    SomeClass() 
    { 
    } 
    void set(T data_) 
    { 
    data = data_; 
    } 
}; 
+0

Notez que si le code présenté peut être converti en Java, en génériques en général Java ont un sous-ensemble des fonctionnalités de ce modèle C++ ont (vous ne pouvez vous spécialiser, pas SFINAE ...) –

Répondre

37
class SomeClass<T> { 
    private T data; 

    public SomeClass() { 
    } 

    public void set(T data_) { 
    data = data_; 
    } 
} 

Vous voulez probablement aussi faire la classe elle-même public, mais qui est à peu près la traduction littérale en Java.

Il existe d'autres différences entre les modèles C++ et les génériques Java, mais aucun de ces problèmes ne concerne votre exemple.

+4

En fait , une différence, qui n'est pas une chose générique/modèle mais une différence plus fondamentale entre C++ et Java, est que la méthode set en C++ copie l'objet fourni, alors que la version Java copie juste la référence. –

+0

Wow, et le truc génial à propos des "génériques", c'est que je peux même exprimer quelque chose comme la classe publique SomeClass ! Je ne pense pas que cette capacité est présente en C++. Trop cool! – sivabudh

+3

ShaChris23: l'idiome répandu dans le C++ stdlib est d'utiliser le typage Duck: "si toutes les tentatives d'utilisation fonctionnent avec l'objet, il a l'interface attendue" (std :: reverse_iterator étant un bon exemple clair), et c'est similaire à Python et [ma compréhension de] Go. Il est toujours utile de faire ces restrictions soi-même (ou du moins les gens le demandent: P), et vous pouvez utiliser boost :: enable_if, les assertions statiques (avec des caractères pour détecter l'héritage dans ce cas) et similaires. Les concepts étaient censés aider à résoudre ce problème, mais c'est une autre histoire. –

6

Vous utilisez "génériques" pour faire en Java:

public class SomeClass<T> { 
    private T data; 

    public SomeClass() { 
    } 

    public void set(T data) { 
    this.data = data; 
    } 
}; 

Wikipedia a une bonne description de generics in Java.

3
/** 
* This class is designed to act like C#'s properties. 
*/ 
public class Property<T> 
{ 
    private T value; 

    /** 
    * By default, stores the value passed in. 
    * This action can be overridden. 
    * @param _value 
    */ 
    public void set (T _value) 
    { 
    value = _value; 
    } 

    /** 
    * By default, returns the stored value. 
    * This action can be overridden. 
    * @return 
    */ 
    public T get() 
    { 
    return value; 
    } 
} 
1
public class GenericClass<T> { 
    private T data; 

    public GenericClass() {} 

    public GenericClass(T t) { 
     this.data = t; 
    } 

    public T getData() { 
     return data; 
    } 

    public void setData(T data) { 
     this.data = data; 
    } 

    // usage 
    public static void main(String[] args) { 
     GenericClass<Integer> gci = new GenericClass<Integer>(new Integer(5)); 
     System.out.println(gci.getData()); // print 5; 

     GenericClass<String> gcs = new GenericClass<String>(); 
     gcs.setData("abc"); 
     System.out.println(gcs.getData()); // print abc; 
    } 
} 
Questions connexes