When I try to set a parameter as extending number using wildcards as shown in the code below -
import java.util.*;
class Try {
public static void main(String [] args) {
List <Integer>a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
System.out.println(foo(a));
}
public static double foo(List<? extends Number> list) {
double x = 0.0;
for (Object e : list)
x += (Integer) e;
return x;
}
}
It compiles fine. However, If i do the same using a generic type, as shown here -
import java.util.*;
class Try {
public static void main(String [] args) {
List <Integer>a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
System.out.println(foo(a));
}
public static <T extends Number> double foo(List<T extends Number> list) {
double x = 0.0;
for (Object e : list)
x += (Integer) e;
return x;
}
}
I get the following syntax error -
Try.java:12: error: > expected
public static <T extends Number> double foo(List<T extends Number> list) {
^
Try.java:12: error: ')' expected
public static <T extends Number> double foo(List<T extends Number> list) {
^
Try.java:12: error: ';' expected
public static <T extends Number> double foo(List<T extends Number> list) {
^
Try.java:12: error: <identifier> expected
public static <T extends Number> double foo(List<T extends Number> list) {
^
4 errors
Why does the second case give me an error? What is the difference between generics and wildcards in this case?