为什么我super只能使用通配符而不使用类型参数?
例如,在Collection界面中,为什么toArray方法不是这样写的
interface Collection<T>{
<S super T> S[] toArray(S[] a);
}
Run Code Online (Sandbox Code Playgroud) 此代码在Java 8中编译,但无法在Java 7中编译:
class Map<K,V> {
static <K,V> Map<K,V> empty() {return null;}
Map<K,V> put(K k, V v) {return null;}
V get(K k) {return null;}
}
class A {
static void f(Map<Integer,String> m){}
public static void main(String[] args) {
f(Map.empty());
}
}
Run Code Online (Sandbox Code Playgroud)
它不会推断出Map返回的具体类型Map.empty():
$ javac7 A.java
A.java:10: error: method f in class A cannot be applied to given types;
f(Map.empty());
^
required: Map<Integer,String>
found: Map<Object,Object>
reason: actual argument Map<Object,Object> cannot be converted to Map<Integer,String> by method invocation …Run Code Online (Sandbox Code Playgroud) 该toArray方法(可以接在执行java.util.ArrayList)如下:
class ArrayList<E> ....{
public <T> T[] toArray(T[] a){
if(a.length < size)
return (T[]) Arrays.copyof(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if(a.length > size)
a[size] = null;
return a;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道我们可以使用<E>而不是<T>在这种情况下吗?喜欢
public E[] toArray(E[] a){
if(a.length < size)
return (E[]) Arrays.copyof(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if(a.length > size)
a[size] = null;
return a;
}
Run Code Online (Sandbox Code Playgroud)
由于ArrayList类iteself已经是通用的<E>,所以我们可以使用它而不是新的泛型类型<T>吗?
以下代码抛出 java.lang.ArrayStoreException异常.据我所知,编译器应该在我使用时生成错误或警告generics.
请检查下面的代码并找到注释行.
public class Test1 {
public static void main(String[] args) {
Collection<Number> nums = new ArrayList<Number>();
nums.add(new Integer(1));
nums.add(new Long(-1));
//every thing is fine here
Number[] aa = nums.toArray(new Number[0]);
for (Number num : aa) {
System.out.println(num);
}
// Even if generics are there,no warning or error is reported by complier
Integer[] bb= nums.toArray(new Integer[nums.size()]);
for (Integer integer : bb) {
System.out.println(integer);
}
}
}
Run Code Online (Sandbox Code Playgroud)
请帮助我理解这种行为.你能帮我理解如何解决这个问题吗?