2009-12-06 10 views
20

¿Cómo escribo un equivalente de esto en Java?¿Cómo crear una clase Java, similar a una clase de plantilla C++?

// C++ Code 

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

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

Tenga en cuenta que mientras que el código se presenta se puede convertir en Java, en general, los genéricos de Java tienen sólo un subconjunto de la funcionalidad que C plantilla ++ tiene (no se puede especializar, sin SFINAE ...) –

Respuesta

37
class SomeClass<T> { 
    private T data; 

    public SomeClass() { 
    } 

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

Es probable que también quieren hacer la propia clase pública, pero eso es más o menos la traducción literal al Java.

Existen otras diferencias entre las plantillas de C++ y los genéricos de Java, pero ninguno de estos son problemas para su ejemplo.

+4

realidad , una diferencia, que no es una cosa genérica/de plantilla, sino una diferencia más fundamental entre C++ y Java, es que el método set en C++ copia el objeto suministrado, mientras que la versión Java simplemente copia la referencia. –

+0

Guau, y lo bueno de los "genéricos" es que incluso puedo expresar algo así como una clase pública SomeClass ! No creo que esa habilidad esté presente en C++. ¡Muy guay! – sivabudh

+3

ShaChris23: la expresión predominante en C++ stdlib es usar pato escribiendo: "si todos los usos intentados funcionan con el objeto, tiene la interfaz esperada" (std :: reverse_iterator es un buen ejemplo claro), y esto es similar a Python y [mi entendimiento de] Go. Todavía a veces es útil hacer esas restricciones usted mismo (o al menos las personas lo piden: P), y puede usar boost :: enable_if, afirmaciones estáticas (con características de tipo para detectar herencia en este caso) y similares para eso. Se suponía que los conceptos ayudarían a resolver esto, pero esa es otra historia. –

6

utiliza "genéricos" para hacer esto en Java:

public class SomeClass<T> { 
    private T data; 

    public SomeClass() { 
    } 

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

Wikipedia tiene una buena descripción 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; 
    } 
} 
Cuestiones relacionadas