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?

Anúncios
Etiquetado

Um pensamento sobre “Uma pequena comparação entre o Generics do Java e do C#

  1. Sebastião. disse:

    Não sei se é insegurança, mas veja uma explicação relacionada em : https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays
    Se tivermos:

    Matrix m1; // T é Object (ou Number?)
    Matrix m2 = new Matrix(10,10); // T é Integer
    m1=m2; // Teoricamente são compatíveis e referenciam o mesmo objeto
    m2.set(0,0,new Integer(10)); // OK
    m2.set(0,0,new Float(0.5)); // Erro, T é Integer e não Float
    m1.set(0,0,new Float(0.5)); // OK, T é Number compatível com Float

    Talvez seja pelo fato de que não é obrigatório declarar o tipo do genérico na declaração da variável. Como não programo em C# você vai ter que testar se ele permite isso? 🙂

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: