Tipo nativo em Java

Pessoal, é possível criar um novo tipo primitivo pra JAVA?

Se não, qual o motivo?

Vlw!

Como assim? Existem apenas 7 tipos primitivos:

byte, char, short, int, long, double, float

sendo que “char” é mais ou menos como se fosse “unsigned short” do C / C++ / C#.

Foi sugerida a inclusão do tipo primitivo “fixnum” que seria um BigInteger ou BigDecimal mas sem várias inconveniências delee, mas isso vai ficar para as calendas gregas, provavelmente, apesar da simpatia por isso que os principais arquitetos do Java têm por esse tipo.

O motivo, provavelmente, é que você teria de mudar muita coisa no Java. Muita coisa mesmo; isso seria algo tão ou mais traumático que a inclusão dos Generics, em termos de ferramentas e estrutura da JVM. Por exemplo, você teria de criar novos bytecodes para suportar esses novos tipos primitivos.

É que uma das propostas pra minha dissertação de mestrado é o desenvolvimento de um tipo intervalar. Sei que é possivel fazer isso através da criação de uma biblioteca. Mas queria saber se poderia ficar um tipo mesmo de Java.

Procure por “interval-based arithmetic”, você vai achar muitas coisas prontas em várias linguagens.

Se você é ligado em teoria de compiladores, poderia bolar uma extensão à linguagem Java (na verdade, uma modificação do Javac) para que aceitasse tipos intervalares.

Infelizmente não é possível em Java efetuar um “overload” de um operador. Não posso ter algo como:

Interval a = (1.2, 0.1);
Interval b = (2.3, 0.1);
Interval c = a + b;

Em C++ posso fazer os overloads mas a definição de constantes ainda deixa a desejar. OU seja, em C++ eu teria de escrever:

Interval a (1.2, 0.1);
Interval b (2.3, 0.1);
Interval c = a + b;

Classes já são tipo de dados, e os métodos são seus operadores.

É possível fazer um A = B + C em outras linguagens onde A, B, e C são objetos, + e = são os métodos, mas essa sintaxe não é possivel em Java.

Mudar a sintaxe, colocar outros tipo primitivos, etc o que vai acontece é que você estará fabricando outra linguagem diferente de Java.

Mas é possível criar uma classe Intervalo?

Tipo… como é feito com o String?

É claro que é possível. O único problema é que os operadores (+, -, * etc.) não podem ser redefinidos para trabalhar com objetos do tipo Intervalo.

Desculpa minha ignorância… heheh

Mas porque não podem ser redefinidos?

Porque a linguagem não deixa. O C# (que roda no ambiente .NET) e a linguagem Scala (que roda na JVM) deixam.

Para ver quanta gente quer que o Java deixe redefinir operadores, veja este lugar:

http://bugs.sun.com/view_bug.do?bug_id=4905919

Entretanto, o pessoal da Sun/Oracle bate o pé firmemente indicando que tão cedo não vão deixar redefinir operadores.

http://java.sun.com/docs/white/langenv/Simple.doc2.html#4098

O que é uma pena, na minha opinião, sou do time que adoraria um recurso desses.

Não vejo onde há simplificação no código. É só comparar a sintaxe com e sem sobrecarga:

bool isValid = (x-1)*(1-y) >= 15; //C# - Existente a partir do .net 4.0 boolean isValid = (x.plus(new BigDecimal(1)).multiply(new BigDecimal(1).plus(y.negate()))).compareTo(new BigDecimal(15)) > 0; //Java

A sobrecarga deixa o código mais legível e mais natural de ler além de permitir o uso dos parênteses.

Depois, que quer coisa mais ilegível do que a sintaxe dos generics?

Iria simplificar muito classes como a BigDecimal, BigInteger, classe matemáticas como essa de intevalo, vetores, matrizes, a classe AffineTransform, as collections (que poderiam ser acessadas como arrays primitivos), etc… etc…

Acho que a comunidade java já é madura o suficiente para não cometer os erros quanto à sobrecarga do C++. Mesmo em C++, faz tempo que esses erros não são cometidos.