Airfreshener
Airfreshener

Reputation: 826

Java abstract class Implementing with generics

I have an abstract class with generic (T1) that extends my Filterable interface:

public abstract class AbstractAdapter < T1 extends Filterable, T2 extends AbstractAdapter.Cell > extends ArrayAdapter < T1 > {

    public abstract class Cell {
        public T1 info;
        //...
    }

    public abstract void setData(T2 cell, int position);

    //...
}

And i have concrete class with method (setData) and Cell class implementations:

public class ConcreteAdapter extends AbstractAdapter < InfoClass, ConcreteAdapter.Cell > {

    public class Cell extends AbstractAdapter.Cell {
        //...
    }

    @Override
    public void setData(Cell cell, int position) {
        InfoClass info = (InfoClass)cell.info; // need to cast from Filterable to InfoClass (why?). Or i have compilation error
    }

    //...
}

So, i have ConcreteAdapter class with first generic class as InfoClass (that extends Filterable), in method setData i have Cell class object, but field "info" i see just as Filterable, not InfoClass. I think, field "info" already should be as generic type, because it declared as

T1 info;

but not

Filterable info;

Is it possible change field type from extendable to generic class without cast? Or its a bug in IDE?

Upvotes: 3

Views: 4000

Answers (1)

Tamas Rev
Tamas Rev

Reputation: 7166

This is a very tricky case because the AbstractAdapter is raw in AbstractAdapter.Cell. If you specify enough types, then you don't need the cast anymore:

public abstract class AbstractAdapter < T1 extends Filterable, T2 extends AbstractAdapter<T1, T2>.Cell > extends ArrayAdapter < T1 > {
    //...
}

and

public class ConcreteAdapter extends AbstractAdapter < InfoClass, ConcreteAdapter.Cell > {

    public class Cell extends AbstractAdapter<InfoClass, ConcreteAdapter.Cell>.Cell {
        //...
    }

    @Override
    public void setData(Cell cell, int position) {
        InfoClass info = cell.info; 
    }

    //...
}

makes it work again. However, it's very complicated. I would move Cell into a top-level class if possible.

Upvotes: 5

Related Questions