Mały exercise z typowania

0

Postawiłem sam sobie zagadkę, czy typ może się powoływać na dwa typy ... chwila niewiadomej, i może w swojej deklaracji, to się kompiluje

public interface IColumnAccessor <RowT extends Serializable, ColT extends Comparable<ColT> , Serializable> {
    ColT get(RowT row);

}


jednak częsciowa implementacja na konkretnych typach daje get tylko z jednym typem, i nie chce być inaczej ;)

public abstract class TestAccessor implements IColumnAccessor {
...
        @Override
        public Comparable get(Object row) {
            return null;
        }
    }

Dotarłem do jakiś granic języka ?

5
Stój Halina napisał(a):

Dotarłem do jakiś granic języka ?

Prawdopodobnie nie umiesz w genericsy i zrobiłeś raw types. Skoro IColumnAccessor przyjmuje argumenty generyczne to mu je podaj. Robiąc implements IColumnAccessor { implementujesz interfejs z wymazanymi typami: https://docs.oracle.com/javase/tutorial/java/generics/bridgeMethods.html

Ogólna zasada jest taka:

  • albo robisz parametry generyczne i je zawsze podajesz,
  • albo nie robisz parametrów generycznych, skoro są sytuacje kiedy nie chcesz ich podawać
1

implements IColumnAccessor {

No i gdzie podałeś te typy tutaj? o_O Skoro nie podałeś to czemu się dziwisz ze dostałeś rawtype?

1

Jak implementujesz generyczny Interface, to albo zrobić klasę generyczną:
class TestAccessor<T, U, V> implements IColumnAccessor<T, U, V>

albo podać typy wprost:
class TestAccessor implements IColumnAccessor<String, Integer, Whatever>

Przy kilku typach generycznych możesz też zrobić mix tego co wyżej - część przekazać jako typy generyczne, część jako konkretne typy:
class TestAccessor<T, U> implements IColumnAccessor<T, U, String>

1 użytkowników online, w tym zalogowanych: 0, gości: 1