返回信息流那么编译器是如何推断类型参数的呢?
我试着这样写
public class Test {
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
private static class ArrayList<E> {
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
}
}
但是报错 Cannot infer type arguments for ArrayList<>
这是什么原因呢?求赐教
补充Arrays的源代码
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
/**
* @serial include
*/
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return a.clone();
}
只粘贴了asList和ArrayList的部分代码
这是一条镜像帖。来源:北邮人论坛 / java / #54749同步于 2017/1/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
java.util.Arrays.asList方法返回new ArrayList<>(a),尖括号里
july93
2017/1/20镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
【 在 fuxuemingzhu 的大作中提到: 】
: 把T换成具体的类,比如Integer ,那么就可以直接放进去int,这个叫做自动装包
自动装包我知道 只是源码里<>里没写泛型参数符号,我试着在另一个类里也这么写 eclipse提示错误
我猜一下,我感觉报错的根本原因还是因为找不到正确的构造方法,ArrayList<E>能这么干因为它里边有实现了List接口
然后asList返回值List能够对得上,然后倒推回来就知道ArrayList中初始化要用楼主写的范型也就是T,所以能对应的上ArrayList(E[] array)这个构造方法。。。
lz原来报错的写法可以这么改:
要么->
public static <T> List<T> asList(T... a) {
return (List)new ArrayList<>(a);
}
虽然肯定是不行的,但是能过编译,既然编译器被骗过了,那么说明范型酱推倒成功了www
要么->
private static class ArrayList<E> -> private static class ArrayList<E> implements List<E>
这样子就对了貌似
我还是不够专业啊,果然这种事情还是应该@暖羊羊
【 在 ytinrete 的大作中提到: 】
: 我猜一下,我感觉报错的根本原因还是因为找不到正确的构造方法,ArrayList<E>能这么干因为它里边有实现了List接口
: 然后asList返回值List能够对得上,然后倒推回来就知道ArrayList中初始化要用楼主写的范型也就是T,所以能对应的上ArrayList(E[] array)这个构造方法。。。
: lz原来报错的写法可以这么改:
: ...................
我傻了 ArrayList是自己写的私类,没有实现List接口,所以报错。