通用类型与使用超类

时间:2017-06-24 23:59:21

标签: java

使用和使用Superclass作为类型本身有什么区别?例如:

int function(int n)
{ if (n <= 1)
    return n;
int i = random(n-1);
return test(i) + test(n - 1 - i);
}

我们定义可以包含形状的arraylist的方式上面最后两行有什么区别?

3 个答案:

答案 0 :(得分:2)

考虑以下两种方法声明:

public static <T extends Number> void sort1(List<T> list>) {
// Do stuff
}

public static void sort2(List<Number> list>) {
// Do stuff
}

现在回想起Integer是Number的子类,但List&lt; Integer&gt;不是List&lt; Number&gt;。

的子类
List<Number> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
sort1(numbers);    // Valid: Number extends Number
sort1(integers);   // Valid: Integer extends Number
sort2(numbers);    // Valid: Type matches exactly
sort2(integers);   // Invalid: integers is not an instance of List<Number>

在这种情况下,有界泛型有意义,因为如果你可以对数字列表进行排序,你也应该能够对整数列表进行排序。这是一个你不能使用T extends Number:

的情况
/** Adds a Double to a list of numbers */
public static void foo(List<Number> list) {
   list.add(5.0);
}

传入一个数字列表并添加一个Double是有效的,但将Double添加到整数列表中是无效的。这就是List&lt; Integer&gt;的原因。不被认为是List&lt; Number&gt;。

的子类

答案 1 :(得分:0)

如果您定义此类:

class NumberList<E extends Number> {
    private List<E> list = new ArrayList<>();
    // various methods here
}

然后您可以像以下示例一样使用它:

// List can only contains Integer objects
NumberList<Integer> intList = new NumberList();

// List can only contains Double objects
NumberList<Double> doubleList = new NumberList();

// List can contains mix of any Number object, e.g. Integer, Double, BigDecimal, etc.
NumberList<Number> numberList = new NumberList();

但这是不允许的:

NumberList<String> stringList = new NumberList();

答案 2 :(得分:0)

List<Shape> shapes = new ArrayList<>(); 将是包含子类型的所有Shape类型对象的容器。您可以将圆形或方形或任何其他形状对象添加到该列表中。此外,分配shapes = new ArrayList<Circle>()将不起作用。

当你说有方法时

public static <T extends Shape> List<T> getShapeList(T...ts) {
    return Arrays.asList(ts);
} 

现在你进行方法调用,如:

List<Circle> circleList = getShapeList(new Circle(3), new Circle(1), new Circle(2));
List<Square> squareList = getShapeList(new Square(4,2), new Square(10,4), new Square(5,1));

它允许您使用此方法返回特定子类类型对象的列表。该方法将泛型参数绑定为Shape类型或任何扩展它的类型。