¿Es posible crear una clase "genérica" en Java que dependa de algún parámetro (en lugar de un tipo)? Algo como esto:

 class RVector<int n>
 {
      double[] v = new double[n];

      public RVector<int n>(double[] d){
      //...
      }

      //...
 }

Que para cada número entero n simularía un vector real con n componentes. Si no, ¿hay algo similar a esto en Java?

1
Andrei Kh 29 dic. 2016 a las 03:00

3 respuestas

La mejor respuesta

No exactamente con los genéricos, pero puede lograrlo pasando n como parámetro en el constructor.

class RVector
{
    double[] v;

    public RVector(double[] d, int n) {
        this.v = new double[n];
        //...
    }
    //...
}
3
marcelovca90 29 dic. 2016 a las 00:07

Los genéricos de Java no son totalmente iguales a las plantillas. Por lo tanto, no puede poner un valor en <>. Debe ser un tipo.

Una solución para esto es pasar n al constructor:

public RVector(int n, double[] d) {
    ...
}

Pero con esto, no puede garantizar la "seguridad de escritura" en tiempo de compilación, sin mencionar que no puede restringir la longitud de double[] para que sea n.

Otra solución sería crear múltiples clases de vectores:

public class Vector1D {
    public Vector1D(double value) { ... } 
}

public class Vector2D {
    public Vector2D(double value1, double value2) { ... }
}

public class Vector3D {
    public Vector3D(double value1, double value2, double value3) { ... }
}
2
Sweeper 29 dic. 2016 a las 00:16

No puedes con los genéricos.

Parece ser un parámetro constructor en lugar de que cada instancia o cada clase tenga un método que devuelva el tamaño del vector

0
Pascal Heraud 29 dic. 2016 a las 00:05