Arquivo da tag: Java

Uma pequena comparação entre o Generics do Java e do C#

Meu objetivo neste post é comparar uma característica do Generics do Java e do C# que encontrei quando tentei criar uma classe para representar uma matriz. Queria guardar a matriz em um vetor linear e acessar seus elementos fazendo uma pequena aritmética no número de linhas e colunas. O objetivo era parametrizar a classe para que pudesse criar matrizes para qualquer tipo numérico.

Comecei pelo Java e tentei o seguinte código:

package matrix;

public class Matrix <T extends Number> {

	private int rows;
	private int columns;
	private T[] linearArray;
	
	public int rows() { return rows;}
	public int columns() { return columns;}
	
	public Matrix  (int rows, int cols){
		this.rows = rows;
		this.columns = cols;
		linearArray = new T[rows*columns];
	}
	
	public T get(int i, int j) {
		if (i > rows || j > columns)
			return null;
		int localIndex = i * rows + j;
		return linearArray[localIndex];
	}
	
	public void set(int i, int j, T value) {
		if (i > rows || j > columns)
			return;
		int localIndex = i * rows + j;
		linearArray[localIndex] = value;
	}
}

O problema é que esta linha:

linearArray = new T[rows*columns];

Fornece o seguinte erro:

Cannot create a generic array of T	Matrix.java	/MatrixComponents/src/matrix	line 15	Java Problem

Pela descrição, é um problema do Java. Criei então código semelhante em C#:

using System;

namespace TestandoArraysGenerics
{
	public class Matrix <T>
	{
		T[] elements;
		int rows;
		int columns;

		int Rows {
			get {
				return rows;
			}
			set {
				rows = value;
			}
		}

		int Columns {
			get {
				return columns;
			}
			set {
				columns = value;
			}
		}

		public Matrix (int rows, int columns)
		{
			this.rows = rows;
			this.columns = columns;
			elements = new T[rows * columns];
		}

		public T this[int i, int j] {
			get {
				return elements[i * rows + j];
			}
			set {
				elements[i * rows + j] = value;
			}
		}
	}
}

A linha

elements = new T[rows * columns];

Funciona perfeitamente. Pergunto então, existe uma situação insegura que Java previne e C# permite? Ou é o contrário, C#, mais moderna e recente, decidiu implementar Generics até a raiz da linguagem?

Etiquetado