Java:使用泛型指定类型的单个子类型

时间:2018-09-08 12:54:05

标签: java generics

我有一个名为DrawableSegment的接口和多个实现该接口的类,例如LineSegmentPercentageSegment

我还有另一个名为BarChart的类,它利用了这些类。 例如,BarChart有一个名为Add(DrawableSegment segment)的方法,该方法可以接受实现该接口的任何对象。

我想将其限制为实现该接口的相同类型的对象。因此,我不想将LineSegmentsPercentageSegments混合使用,如果我添加了LineSegment,我希望其余的添加项也都是LineSegments。如果我添加PercentageSegments,我希望其余的都是PercentageSegments,如果我确实尝试添加LineSegment,我希望它是类型错误。

有没有办法表达这个?

2 个答案:

答案 0 :(得分:2)

这是你的意思吗?

import java.util.ArrayList;
import java.util.List;

interface DrawableSegment {}

class LineSegment implements  DrawableSegment {}

class PercentageSegment implements  DrawableSegment {}

class BarChart<T extends DrawableSegment> {
    private List<T> drawableSegments = new ArrayList<>();

    public void add(T drawableSegment) {
        this.drawableSegments.add(drawableSegment);
    }

    public List<T> getDrawableSegments() {
        return this.drawableSegments;
    }
}

public static void main(String[] args) {
    BarChart<LineSegment> barCharLineSegment = new BarChart<LineSegment>();
    barCharLineSegment.add(new LineSegment());
    barCharLineSegment.add(new PercentageSegment()); // Compiler Error: cannot be applied
}

答案 1 :(得分:1)

如果我正确理解了您的问题,则希望在运行时处检查对象的类型,这意味着如果添加了LineSegment,则随后的分配只会允许{{1} },而不是LineSegment。在这种情况下,我们可以在运行时检查第一个项目的类,然后将其与下一个项目进行比较。请查看我的代码是否有帮助:

PercentageSegment