相关疑难解决方法(0)

使用'super'关键字绑定泛型

为什么我super只能使用通配符而不使用类型参数?

例如,在Collection界面中,为什么toArray方法不是这样写的

interface Collection<T>{
    <S super T> S[] toArray(S[] a);
}
Run Code Online (Sandbox Code Playgroud)

java generics language-design super

55
推荐指数
3
解决办法
1万
查看次数

通用类型推断无法使用方法链接?

此代码在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)

java generics type-inference java-7 java-8

27
推荐指数
1
解决办法
2334
查看次数

为什么Collection.toArray(T [])不采用E []

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 generics arraylist

11
推荐指数
2
解决办法
733
查看次数

泛型不执行类型擦除

以下代码抛出 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)

请帮助我理解这种行为.你能帮我理解如何解决这个问题吗?

java generics

2
推荐指数
1
解决办法
71
查看次数