java"泛型泛型类型"

时间:2014-03-24 21:25:48

标签: java generics

在我的申请中,我有一个董事会。董事会由单元组成。每个单元格都有一个int值。 很少有类型的董事会会扩展董事会。 每种类型的电路板将以不同的方式表示电池。例如,一个人会使用一个List,而另一个人会使用一个Tree。

所以这就是尝试的内容:

public abstract class Board<T> {
    T<Cell> cells;  //error - The type T is not generic; it cannot be parameterized with arguments <Cell>

    protected abstract void setValues(T<Integer> values);
}

不幸的是,我不能使T成为通用类型。 我该如何实现?

3 个答案:

答案 0 :(得分:1)

我发现你的方法太复杂了。 Peter.petrov接近我将要做的事。

如果你需要List和Tree(TreeSet),两者都实现了接口Collection,为什么不使用它?除了添加,删除,迭代之外,你还需要额外的工作吗?

Collection (Javadoc)

所以你上课了(我添加了一些Java8功能)

public abstract class Board {
    Collection<Cell> cells;  

    // Don't need to be abstract
    protected void setValues(Collection<Integer> values) {
        Stream<Cell> transformed = values.stream().map(Cell::new);
        cells.addAll(transformed.collect(Collectors.toList()));
    }
}

class Cell {
    private Integer value;

    Cell(Integer value) {
        this.value = value;
    }
}

如果您需要(出于某种原因需要额外的东西,请扩展此类并实现/覆盖将执行特殊操作的方法)。希望我能帮到你,但我真的没有为你的例子看到一个用例。

答案 1 :(得分:0)

我并不认为在这里需要使用泛型。

public abstract class Board {
    Holder<Cell> cells;   

    protected abstract void setValues(Integer[] values);
}

现在让你的List和Tree实现/扩展Holder 你可以有两个类ListHolder和TreeHolder都持有
单元格,但一个由List支持,另一个由Tree支持。

实际上,setValues可能更有意义 ListHolder和TreeHolder实现的Holder方法。

答案 2 :(得分:0)

你需要有类似的东西:

public abstract class Board<T extends OtherGenericClass<TT>, TT> {
    T cells;
    public Board(T cells) {
        this.cells = cells;
    }
    protected abstract void setValues(T<Integer> values);

    public static void main(String[] args) {
        Cell<Integer> cells = new Cell<Integer>();
        Board<Cell<Integer>,Integer> board = new Board<Cell<Integer>,Integer>(cells);
    }
}

这看起来不像你想要的......我想你宁愿这样:

public abstract class Board<T> {
    Cell<T>[] cells;
    public Board(Cell<T>[] cells) {
        this.cells = cells;
    }
}

使用Cell类:

public abstract class Cell<T> {
    T cellValue;
    public Cell(T cellValue) {
        return cellValue;
    }
}