Herança com Generics

Olá,

gostaria de ver a opinião de vocês sobre uma situação como esta:

estou desenvolvendo uma aplicação para gerar gráficos em condições específicas para a empresa em que trabalho.
Os gráficos de barras e linhas possuem eixos. Logo, poderei ter uma classe Axis.
Porém, em determinadas situações, o eixo X de um gráfico terá valores monetários, em outras valores inteiros ou datas, e assim vai…
Para cada tipo que será exibido pela aplicação, há um tratamento diferente dos valores. Por isto, criei a seguinte classe:

public abstract class Axis<T>  { 
        private List<T> labels;
	private Double axisWidth;
	private Double axisHeight;
	private Double x;
	private Double y;
        //set and get
        public abstract void drawAxis();
}

E criei algumas classes específicas para cada tipo, como:

public class CalendarAxis extends Axis<Calendar> { 
         //nesta trato valores de data (como somar as datas baseado na escala do gráfico), formatar a saída (usando dateformat...)
}
public class CalendarAxis extends Axis<Long> { 
         //nesta trato valores monetários (como somar os valores), formatar a saída (usando numberformat...)
}

Até aí tudo bem, o problema surge quando faço isso:

  Axis axis = new CalendarAxis();

Obviamente, devido ao fato de generics não existirem em tempo de execução e por causa do polimorfismo em si, o objeto axis aceita qualquer List, independente do tipo que ela foi parametrizada. É dispensável dizer que isto é error prone…

Não quero ter que fazer isso:

  CalendarAxis calendarAxis = new CalendarAxis();

por que comprometeria a flexibilidade do meu código…

Qual vcs acham que seria a melhor solução para esta situação?

P.S.: eu sei que dá para abstrair vários aspectos do que eu disse acima e criar mais N classes, mas há minha questão não é sobre isso hehe :wink:

P.S.: não sei se esta é a melhor abordagem, porém não fecho outra maneira fazê-lo, uma vez que crio um LineChart, por exemplo, e o Spring se encarrega de injetar as dependências para eu… Enfim, sugestões de alterações no design são bem vindas =D

Abraço,
obrigado

Alguns comentários:

1 - A classe Axis precisa mesmo ser abstrata?

2 - Por que não inicia a lista [labels] já na declaração?

private List<T> labels = new ArrayList<T>();

Os métodos get() e set() para [labels] também podem ser parametrizados com .

Opa, vlw pela resposta.

[quote=roger_rf]Alguns comentários:
1 - A classe Axis precisa mesmo ser abstrata?
[/quote]
Não necessariamente, entretanto prefiro que ela seja pq ela não deveria ser instanciada, mas somente um de seus tipos, mas posso tirar o abstract dali sem problemas :slight_smile:

[quote=roger_rf]
2 - Por que não inicia a lista [labels] já na declaração?

private List<T> labels = new ArrayList<T>();

Os métodos get() e set() para [labels] também podem ser parametrizados com .[/quote]

Sim, porém, penso assim:

Axis a = new CalendarAxis();
List<String> l  = new ArrayList<String>();
a.setLabel(l); //Vai funcionar de boas, o problema vai acontecer a hora que eu tentar tratar esta lista como se fosse uma lista de Calendar....

Eu poderia usar o instanceof para verificar o tipo que está na lista e lançar uma exceção caso não seja o tipo esperado, porém também me questiono um pouco sobre isso…
Enfim, esta é uma questão mais filosófica :slight_smile:

Obrigado pela resposta =D