使用和使用Superclass作为类型本身有什么区别?例如:
int function(int n)
{ if (n <= 1)
return n;
int i = random(n-1);
return test(i) + test(n - 1 - i);
}
我们定义可以包含形状的arraylist的方式上面最后两行有什么区别?
答案 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类型或任何扩展它的类型。