Uso de Generics para implementação de uma classe de três formas diferentes

Caros amigos,

Estamos trabalhando num projeto de conversão de um framework do C# para Java e encontramos um detalhe interessante com generics. No C# temos uma classe Teste que é declarada de três formas diferentes por se tratar do uso do generics. Vou colocar um pequeno trecho de código
em C# para facilitar o entendimento do problema, espero que isso nao gere nenhum problema de vaidade :wink:

Em C# a classe Teste esta declarada da seguinte forma em um único arquivo:

public class Teste : Object
{
}

public class Teste : List
{
}

public class Teste<C, V> : Dictionary<C, V>
{
}

Olhando o codigo em C# nos temos uma classe teste que pode herdar de TRÊS classes diferentes, Object, List e Dictionary. Quando vamos criar
esta classe em Java temos um problema, em Java não podemos declarar mais de uma classe no mesmo arquivo, mesmo que esta classe use generics, também não podemos criar um arquivo com outro nome, porque o nome da classe é Teste.

Para matar minha curiosidade de como as classes em Java foram implementadas com Generics eu baixei o codigo fonte e notei que a classe Vector do java, por exemplo, não contém duas declarações para o Generics, ela simplesmente declara Vector e não existem nenhum código específico para uma ou outra classe.
Outra coisa interessante é que em C# a mesma classe só pode herdar de várias outras com o uso de Generics.

A pergunta é, existe uma forma de criar uma mesma classe em Java herdando de três classes diferentes usando Generics como no C#?

O interessante é quem em C# a herança multipla também não é permitida.

Isso não funciona em Java pq Generic são simplesmente sintax sugar, o compilador usa apenas para gerar mais erros e warnings, depois simplesmente descarta toda informação.

Ou seja, “Teste<T>” quando compilado vai ser exatamente igual a “Teste”, Generics não fazem parte da assinatura do tipo.

No caso do C# ele usa “reification”.
No C#, typeof Teste<String> != typeof Teste<Integer>
No Java, Teste<String>.class == Teste<Integer>.class.

Além disso, no C#, Teste != Teste<T> != Teste<T,U>. Apenas o nome é igual; isso foi feito para permitir a coexistência de classes genéricas e não genéricas no .NET Framework. E é por isso que parece que uma mesma classe pudesse herdar de 3 classes distintas; na verdade, são 3 classes diferentes; apenas o nome é igual.

Portanto, não dá para fazer a mesma coisa que você fez no C#. Sinto muito.