我遇到像这样的Java代码:
public interface Foo<E> {}
public interface Bar<T> {}
public interface Zar<?> {}
Run Code Online (Sandbox Code Playgroud)
上述所有这三者之间有什么区别,他们在Java中称这种类或接口声明是什么?
我正在阅读OracleDocGenericMethod中的泛型方法.当它说何时使用通配符以及何时使用通用方法时,我对比较感到非常困惑.引用文件.
Run Code Online (Sandbox Code Playgroud)interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }我们可以在这里使用泛型方法:
Run Code Online (Sandbox Code Playgroud)interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too! }[...]这告诉我们类型参数被用于多态; 它唯一的作用是允许在不同的调用站点使用各种实际的参数类型.如果是这种情况,则应使用通配符.通配符旨在支持灵活的子类型,这是我们在此尝试表达的内容.
难道我们不认为外卡(Collection<? extends E> c);也支持那种多态?那为什么泛型方法的使用被认为不好呢?
继续向前,它说,
通用方法允许使用类型参数来表示方法和/或其返回类型的一个或多个参数的类型之间的依赖关系.如果没有这种依赖关系,则不应使用通用方法.
这是什么意思?
他们提出了这个例子
Run Code Online (Sandbox Code Playgroud)class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }[...]
我们可以用另一种方式为这种方法编写签名,而不使用通配符:
Run Code Online (Sandbox Code Playgroud)class Collections { public static <T, S extends …
我是Generic的新手,我的问题是:两个函数之间有什么区别:
功能1:
public static <E> void funct1 (List<E> list1) {
}
Run Code Online (Sandbox Code Playgroud)
功能2:
public static void funct2(List<?> list) {
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
有人可以解释一下这两种方法之间的区别吗?它们一样吗?就他们解决的问题而言,他们看起来与我相同.如果它们相同,为什么需要??
方法#1,无界限
public static void printList(List<?> list) {
for (Object elem : list)
System.out.println(elem + " ");
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
方法#2,无界:
public static <T> void printList(List<T> list) {
for (Object elem : list)
System.out.println(elem + " ");
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
方法#1,有界
public static void printList(List<? extends Number> list) {
for (Object elem : list)
System.out.println(elem + " ");
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
方法#2,有界:
public static <T extends Number> void printList(List<T> list) {
for (Object elem : list)
System.out.println(elem + " ");
System.out.println(); …Run Code Online (Sandbox Code Playgroud)