Chcę napisać ogólną klasę kontenera. Dwa parametry typu oznaczają typ zawartych elementów i typ klucza do wyszukiwania elementów. Kolekcja zawiera metodę get, która pobiera klucz i zwraca element. Tak więc pierwszy podpis dla klasy wyglądałby tak:

class MyContainer<E, K> {
  ...
  E get(K k) { ...}
  ...
}

Teraz chcę ograniczyć K do klas, które same są kontenerami dla elementów, których chcę użyć jako kluczy.

Te klasy zawierające klucze są wyznaczane przez implementację określonego interfejsu:

interface ProvidesKeys<E> {...}

A potem mam konkretne realizacje, takie jak

class SomeInts implements ProvidesKeys<Integer> {...}

Co oznacza, że SomeInts wybiera niektóre elementy z liczb całkowitych, które mogą być używane jako klucze.

Chcę używać MyContainer w ten sposób:

MyContainer<String, SomeInts> myContainer = new MyContainer<>();
...
myContainer.get(3);

Problem w tym, że 3 jest typu Integer, a nie SomeInts. Więc mój początkowy schemat dla MyContainer już nie działa.

Czy istnieje sposób na ograniczenie K w taki sposób, że mam dostęp do typu elementu kontenera klucza?

Próbowałem

class MyContainer<E, K extends ProvidesKeys<K> {....}

I symbole wieloznaczne, ale nic nie daje mi dostępu do typu elementu klucza typu dostarczającego, więc mogłem mieć poprawną metodę E get(X k) {...} !? Czy muszę wprowadzić zmienną trzeciego typu, aby reprezentować typ elementu klucza (chociaż jest to niejawne w kontenerze kluczy)?

0
ThomasH 25 listopad 2019, 21:26

1 odpowiedź

Najlepsza odpowiedź

Czy muszę wprowadzić zmienną trzeciego typu, aby reprezentować typ elementu klucza (chociaż jest to niejawne w kontenerze kluczy)?

Tak. Ty robisz. Nie ma innego sposobu na uzyskanie dostępu do tego typu niż ustawienie go jako parametru.

1
Louis Wasserman 25 listopad 2019, 18:59