JAVA泛型的问题:急求大神。一个关于"泛型"和Object[]数组的坑

下面是我写的一个Java代码,
图片说明
我知道24行的直接转换是不行的,因为内部数组本质是一个Object[]的数组,但是运行该程序是会报错的,报错的位置是在25行,错误信息是类型转换错误。但是26行这样的写法是没有问题的,如果将25行注释掉,程序可以正常运行。我想知道的是25和26行代码区别在哪里,为什么25行是会报错的,是编译器做了什么事情吗?我看过这个源代码编译后的class文件,25行加入了一个类型检查,但是为什么会加上类型检查?挺急的,跪求大神解答。

源代码如下:
public class GenericArray {

private Object[] array;

public GenericArray(int size) {
    array = new Object[size];
}

public void put(int index, T item) {
    array[index] = item;
}

public T get(int index) {
    return (T) array[index];
}

public T[] rep() {
    return (T[]) array;
}

public static void main(String[] args) {
    GenericArray<Integer> ga = new GenericArray<>(10);
    for(int i = 0; i < 10; i++) {
        ga.put(i, i);
    }
    for(int i = 0; i < 10; i++) {
        System.out.println(ga.get(i) + " ");
    }
    System.out.println();
    try {
        System.out.println(ga.rep().toString());
        System.out.println(((Object)ga.rep()).toString());
    } catch(Exception e) {
        e.printStackTrace();
    }
}

}

8个回答

我们无法获知类型T是否含有方法toString()方法。这是为什么呢?就是因为万恶的擦除引起的,在Java代码运行的时候,它会将泛型类的类型信息T擦除掉,就是说运行阶段,泛型类代码内部完全不知道类型参数的任何信息,即使toString()是object的方法。

qq_22246675
菩提本无树明镜亦非台 回复无名同学: 我的意思是为啥哪个地方会有强制类型转换的过程
2 年多之前 回复
tomorrow_fine
无名同学 回复菩提本无树明镜亦非台: Object object = 1; System.out.println((Integer) object); Object[] objects = new Object[]{1, 2, 3}; System.out.println((Integer[]) objects);类型擦除后的强转,数组会转化失败
2 年多之前 回复
qq_22246675
菩提本无树明镜亦非台 是Object的方法又如何 我又不是打印的信息有误 是强转异常了 不是你说的这个事啊 大兄弟
2 年多之前 回复
    @Test
    public void test(){
        Integer[] ii = new Integer[]{};
        Object[] oo = new Object[]{};
        ii = (Integer[])oo;
    }

事实是因为你的array真实类型是Object[],所以此处强转为Integer[]会报错。除非arry = new Integer[]{},那么这里转换就不会报错了。

luaifei2008
luaifei2008 回复外星喵: 在Java中数组是具有协变性的,Integer[]是Object[]的子类,Java认为没毛病~
2 年多之前 回复
qq_22246675
菩提本无树明镜亦非台 为啥那个位置是Integer[] 你不能因为报个错就确定那是Integer[]数组吧 我知道Object[] 肯定不能转为Integer[] 问题是哪个25行的位置发生了什么 它为什么进行强转
2 年多之前 回复
c15158032319
外星喵 父类强转成子类并没有问题,就像Object可以强转成Integer,但是问题是Interger[]是Object[]的子类么?
2 年多之前 回复

用String.valueOf(ga2.rep())看下

qq_22246675
菩提本无树明镜亦非台 试了 返回的肯定是一个Object[]数据类型
2 年多之前 回复

报的什么错,,,感觉不应该呀,,,题主能把代码发一下吗?

qq_22246675
菩提本无树明镜亦非台 回复小鼠标丶: 你用vim或者普通的txt写一个java源文件自己去编译 不可能哪个TXT的编辑器会提示你返回的是Integer[]吧 现在的问题是它为什么会这么做 而是那个报错的地方到底发生了什么? 是什么导致的它这么做的
2 年多之前 回复
qq_22246675
菩提本无树明镜亦非台 回复小鼠标丶: 我想知道的是为啥那是Integer[] 我知道IDE提示的Integer[] 如果你要用VIM编辑java源文件 肯定不会这么提示你
2 年多之前 回复
Small_Mouse0
小鼠标丶 回复菩提本无树明镜亦非台: public T[] rep() { return (T[]) array; },,,IDE中可能提示的是Intager[],,其实返回的是Object[],,直接当Intager[]使用就会报错,原因是,,Object[]无法强转为Intager[],,但是Object[],,,可以强转为Object使用,,打印toString时就会显示类型是Object类型,,,,如果不强转就会当Intager使用,,就会报错。,,,题主可能有这样的问题,为什么在强转为T[],时没报错,,这个可能是规定吧,,不知道那位大神能解释,这个转换为什么不报错。
2 年多之前 回复
qq_22246675
菩提本无树明镜亦非台 我把代码发上去了
2 年多之前 回复

这样就不会报错了,你的那个rep()方法想要返回数组的话直接调用Arrays工具类的方法就行。
我的eclipse的输出结果:
0 1 2 3 4 5 6 7 8 9
GenericArray [array=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]

 import java.util.Arrays;

public class GenericArray<T> {
    private T[] array;

    public GenericArray(int size) {
        array = (T[]) new Object[size];
    }

    public void put(int index, T item) {
        array[index] = item;
    }

    public T get(int index) {
        return array[index];
    }

    @Override
    public String toString() {
        return "GenericArray [array=" + Arrays.toString(array) + "]";
    }

    public static void main(String[] args) {
        GenericArray<Integer> ga = new GenericArray<>(10);
        for(int i = 0; i < 10; i++) {
            ga.put(i, i);
        }
        for(int i = 0; i < 10; i++) {
            System.out.print(ga.get(i) + " ");
        }
        System.out.println();
        try {
            System.out.println(ga.toString());
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
qq_22246675
菩提本无树明镜亦非台 我只是想知道为啥25行会运行时报错 你这答非所问啊 大兄弟 其他的情况不需要考虑 我只想知道那个位置到底发生了什么
2 年多之前 回复

发来看一下帮你试一下

首先,子类数组转父类数组没问题,如 String[] s; 可以转为 Object[] o = (Object[])s;
但父类数组不能转成子类数组,因为不能保证父类的元素都符合子类类型,因为同一个父类可以有不同的子类

所以
第一种情况,Object[] o是确定的类型,String[] s也是确定的类型,所以编译期间编译器能知道父类数组不能转成子类数组,所以报错

而第二种是泛型擦除
Object[] o是确定的类型,T[] t是泛型,编译的时候编译期不知道T[]是什么类型,而把泛型擦除,即把T[]变为Object[](Object[]是父类数组没问题),所以编译器只是给出警告

参考链接:http://bbs.csdn.net/topics/390028191

qq_22246675
菩提本无树明镜亦非台 回复luaifei2008: 好吧 大兄弟 我一直在考虑它为什么会发生强转 编译器到底做了什么 我也没搞懂。。。
2 年多之前 回复
luaifei2008
luaifei2008 回复菩提本无树明镜亦非台: 由于泛型擦除的原因,rep()方法实际返回的是Object[]数组,并非Integer[]数组,从报错可以看到是Object[]转Integer[]失败。至于为什么会存在类型转换这一步,目前还没有考虑清楚。
2 年多之前 回复
qq_22246675
菩提本无树明镜亦非台 我只是想知道为啥25行会运行时报错 你这答非所问啊 大兄弟
2 年多之前 回复
luaifei2008
luaifei2008 也就是说,泛型的类型转换T[] array,不管泛型为何种类型,最后都会变成Object[] array,Object[]是父类数组肯定是没问题的,所以编译器只会警告提醒。
2 年多之前 回复

3行定义,改成T[] array

qq_22246675
菩提本无树明镜亦非台 那个没关系的 因为泛型擦除之后 都是Object[] 你那改一下只是换个位置而已 没解决问题
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java通过反射实例化泛型类的问题

Java语言中,想通过反射实例化一个抽象类的子类,问题也可以简化点,可以建个类继承这个抽象类,然后实例化子类。 [code="java"] public abstract class MyClass<T> { MyClass() { } } [/code] 在代码中可以这么写: [code="java"] new MyClass<String>() {} [/code] 但是如果通过反射,怎么把String这个type传进去,或者通过反射获得constructor,怎么把泛型信息传进去: 下面这个是个错误的写法,只是说明要实现的内容: [code="java"] new MyClass<Class.forName("String")>() { } [/code]

java泛型问题,方法参数问题

Java泛型. 代码如下: class Info<T>{ private T var; public void setVar(T var){ this.var=var; } public T getVar(){ return this.var; } public String toString(){ return this.var.toString(); } } 下面是第一个测试程序: public class GenericsDemo6{ public static void main(String []agrs){ Info info=new Info(); info.setVar("lixinghua"); String str=(String)info.getVar(); System.out.println(info.getVar()); } } 第二个测试程序; public class GenericsDemo8{ public static void main(String []agrs){ Info<String> info=new Info<String>(); fun(info); } public static void fun(Info<Object> info){ System.out.println(info.getVar()); } } 为什么第一个测试程序可以运行,而第二个不可以?第一个测试程序没有指定泛型,则默认是Object,这里String可以向上转型为Object,而第二个程序却不可以向上转型为Object?

java泛型问题,定义泛型方法

java泛型中,定义泛型方法格式:public <T> T fun(T t),这几个T分别是什么意思? 我知道最后一个T是参数,那前面两个T表示什么?哪个表示返回类型?求高手指教

java 泛型擦除发生在哪个阶段,如何用反编译工具查看泛型擦除后的代码?

有如下的泛型类: public class Pair<T> { public Pair() { first = null; second = null; } public Pair(T first, T second) { this.first = first; this.second = second; } public T getFirst() { return first; } public T getSecond() { return second; } public void setFirst(T newValue) { first = newValue; } public void setSecond(T newValue) { second = newValue; } private T first; private T second; } 用javac编译后再用javap 查看代码,如下: Compiled from "Pair.java" public class Pair<T> { public Pair(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: aconst_null 6: putfield #2 // Field first:Ljava/lang/Object; 9: aload_0 10: aconst_null 11: putfield #3 // Field second:Ljava/lang/Object; 14: return public Pair(T, T); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: aload_0 5: aload_1 6: putfield #2 // Field first:Ljava/lang/Object; 9: aload_0 10: aload_2 11: putfield #3 // Field second:Ljava/lang/Object; 14: return public T getFirst(); Code: 0: aload_0 1: getfield #2 // Field first:Ljava/lang/Object; 4: areturn public T getSecond(); Code: 0: aload_0 1: getfield #3 // Field second:Ljava/lang/Object; 4: areturn public void setFirst(T); Code: 0: aload_0 1: aload_1 2: putfield #2 // Field first:Ljava/lang/Object; 5: return public void setSecond(T); Code: 0: aload_0 1: aload_1 2: putfield #3 // Field second:Ljava/lang/Object; 5: return } 说好的类型擦除呢?怎么才能看到类型擦除后的代码?

java泛型当中String 和Object之间是什么关系

Map<String, Object>里面的参数可以反过来写吗 写成Map <Object,String>

关于java泛型,如何做一个通用的方法?

需求: 做一个通用的方法,把service和实体类传进去,能够根据这个service去查一次数据库。 public Object encolseModel(Class object, Service service,ProceedingJoinPoint proceedingJoinPoint){ object = (Class)proceedingJoinPoint.getArgs()[0]; if (object != null) { object = service.findById(object.get()); } return object; } 写到这里有点懵比 代码需要实现: 1.把【proceedingJoinPoint.getArgs()[0];】强制转换成某个实体类,比如Employee; 2.通过service,去数据库中查询出某个数据,返回object, 这是源代码,怎么把这段代码做的有通用性? TblEmp tblEmp = (TblEmp) proceedingJoinPoint.getArgs()[0]; if (tblEmp != null) { tblEmp = tblEmpService.findById(tblEmp.getEmpId()); }

Java泛型问题,空指针问题

程序如下:public class GenericsDemo11{ public static void main(String []agrs){ Info<String> i1=new Info<String>(); if(i1!=null){ System.out.println("不为null"); } fun(i1); } public static void fun(Info<? super String> info){ System.out.println(info); } } 程序调用fun方法时出现空指针,为什么?i1不是已经分配了堆内存吗,为什么结果会出现空指针错误?

关于java泛型和多态问题

最近看泛型的时候有个疑惑,感觉泛型和多态使用场景很像,现在有点混淆这两个概念,既然已经有了多态的概念,为什么又会提出泛型,它们的使用场景是什么呢?什么时候使用多态,什么时候使用泛型?

Java类的泛型参数能作为另外一个泛型类的参数传入吗?

最近遇到一个棘手的泛型问题,精简化后,代码如下: ``` import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class testMain { public static void main(String[] args) throws IllegalAccessException, InstantiationException { People people = new People(); people.doIt("I'm a student!"); } } interface Say { void say(String word); } class Student implements Say { public void print(String say) { System.out.println(say); } @Override public void say(String word) { print(word); } } interface ExecutorCallbackHandler<M, P> { void execute(M mapper, P param); } class DoSomeThing { public <M, P> void batchDo(ExecutorCallbackHandler<M, P> executorCallbackHandler, P param) throws IllegalAccessException, InstantiationException { Type[] genTypes = executorCallbackHandler.getClass().getGenericInterfaces(); Type[] params = ((ParameterizedType) genTypes[0]).getActualTypeArguments(); Class<M> mapperClass = (Class<M>) params[0]; M mapper = mapperClass.newInstance(); executorCallbackHandler.execute(mapper, param); } } class AbstractPeople<M extends Say> { private DoSomeThing doSomeThing = new DoSomeThing(); public void doIt(String param) throws InstantiationException, IllegalAccessException { doSomeThing.batchDo(new ExecutorCallbackHandler<M, String>() { @Override public void execute(M people, String param) { people.say(param); } }, param); } } class People extends AbstractPeople<Student> { } ``` 泛型参数Student,经过AbstractPeople.doIt传入DoSomeThing.batchDo,但是解析时,泛型参数M并未解析成Student,导致出现异常。 请问,是什么原因,如何解决

JAVA_数组_泛型:我写了一个数组结合泛型的通用求和方法,求帮忙优化,写的太烂了

=====《求求大神帮我优化下啊,我写的太烂了》==== public static void main(String[] args) { Number[] num1 = {2, 3, 3, 4, 5}; //Integer Number[] num2 = {1.1, 2.0, 3.0, 4.0, 5.0}; //Double System.out.println(num1[0].getClass().getTypeName()); System.out.println(new ArraysTest().ArraysSum(num2)); } public static <T extends Number> T ArraysSum(T[] num) { System.out.println(num.getClass().getTypeName()); Double sum = 0.0; for (int i = 0; i < num.length; i++) { sum += num[i].doubleValue(); } if (num[0].getClass().getTypeName().equals("java.lang.Integer")){ Integer result = (int)((double)sum); return (T)result; } if (num[0].getClass().getTypeName().equals("java.lang.Double")){ Double result = sum.doubleValue(); return (T)result; } return (T)sum; } 如何结合instanceof 更加智能的判断?

java泛型<?>什么泛型参数

java泛型<?>什么泛型参数,是不是无视它,假如可以无视它,为什么还要写上它

关于Java泛型反射问题

public static void main(String[] args) { //告诉编译器我这个集合只能存储String类型的 List<String> col=new ArrayList<String>(); //告诉编译器我这个集合只能存储Integer类型的 List<Integer> col2=new ArrayList<Integer>(); //输出结果为:true //这就是常说的去除,编译后jvm虚拟机不会知道这个集合存储什么类型的值 System.out.println(col.getClass()==col2.getClass()); //看我如何将String存储到集合col2中。 /** * 在运行过程中,jvm根本不知道col2应该存放什么类型的数据,只是我们在编译器中限定了。 * 我们通过反射可以获取list的add方法给col2存储其他类型的数据。如这里就可以将“abc”存放到col2中 * 不明白这里为什么参数一定要是Object.class,不能改为String.class */ try { col2.getClass().getMethod("add", Object.class).invoke(col2, "abc"); System.out.println(col2.get(0)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ``` ``` 为什么这里必须是Object.class了,list里的add是泛型啊。col2.getClass().getMethod("add", Object.class)

java泛型异常,如何解决

public static <AnyType extends Comparable<? super AnyType>> AnyType[] mergesort(AnyType[] a,AnyType[] b) { int i=0; int j=0; int index=0; AnyType[] tmp=(AnyType[]) new Comparable[a.length+b.length]; while(i<a.length&&j<b.length){ if(a[i].compareTo(b[j])<0) { tmp[index]=a[i]; i++; index++; } else{ tmp[index]=b[j]; j++; index++; } } return tmp; } public static void main(String[] args){ Integer a[]={1,13,24,26}; Integer b[]={2,15,27,28}; Integer[] tmp= (Integer[])mergesort(a, b); System.out.println(tmp); } } 结果:Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Comparable; cannot be cast to [Ljava.lang.Integer; at testcc.mergeSort.main(mergeSort.java:58) 求问如何解决

关于JAVA泛型的类型擦除的一些疑问

例如 public class list<E> { private Object[] elements; @SuppressWarnings("unchecked") public E get(int n) { return (E)elements[n]; } } 按照泛型的类型擦除不应该都变成Object了吗, public E get(int n) { return (E)elements[n]; }应该也变成 public Object get(int n) { return (Object)elements[n]; }如果用的是list<String>的get方法,为什么最后能返回String类型而不是Object类型。

Java 泛型类型转换问题

现在有一个Method 返回值假定为Object<,Object> 通过getReturnType 获得到Object<,T> 但是转换的时候我需要转换成 Object<,Object> 这样我才能继续接下来的步骤 不然会报错 我如何通过反射拿到一个完整的Object<,Object>这种类型 然后去转换? 额 上面那些逗号可以忽略掉 发现发布上去后<,Object>不显示了 尴尬

java 泛型类的构造函数,急急!!!

问题1. class demo<T> { demo<T z> { System.out.println(z); } } class temp { public static void main(String [] args) { demo <String>d=new demo<String> demo("csdn"); /*在这里我 如果 这样 为啥不报错 ,难道 泛型类的 构造函数不被泛型支配?*/ } } ``` ``` 问题2. class demo { public static void main(String [] args) { ArrayList al=new ArrayList(); al.add("csdn01");//他这里存进去的 是什么类型?String类型?Object? Iterator <String>it=al.iterator();//这里把数据传到迭代器过程中 是不是发生了类型转换,当我 写上al.add(4);我运行会报出 classcastException所以我觉得发生了类型转换 } }

dubbo rpc如何指定fastjson方式序列化参数对象

我在使用dubbo RPC请求时,参数中包含泛型的List集合对象,使用post方式提交时,系统后台报错如下 user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0 , dubbo version: 2.8.4, current host: 127.0.0.1 2017-07-31 11:29:10,310 INFO (LoggingFilter.java:73) - [DUBBO] The contents of request body is: {"sign":"991ca99cb509b927b83994b877666f53","appId":"001","requestTime":"1487687421","service":"credit","channelCode":"200800120036", "loanList":"[{\"approvalOpinions\":\"|【外部意见】2|【意见】d|【外部意见】d|【意见】d|【外部意见】d|【意见】d|【外部意见】d\",\"brandMode\":\"奥迪(进口) - A6L 2.5 30FSI 技术型\",\"contactId\":\"1516000038\",\"customerId\":\"济南分公司\",\"idNumber\":\"564564\",\"idNumberType\":\"Ent02\",\"isGps\":1,\"loanAmount\":162557.4,\"loanAmountRemain\":162557.4,\"loanAmountZrb\":162557.4,\"loanAmountZrb2\":162557.4,\"loanEndDate\":\"2017/04/26\",\"loanEndDateZrb\":\"2018/03/28\",\"loanLife\":12,\"loanLifeRemain\":8,\"loanMode\":\"租赁模式\",\"loanPrfoitZrb\":0.01,\"loanProfit\":0.00416667,\"loanStartDate\":\"2016/04/26\",\"loanStartDateZrb\":\"2017/07/28\",\"payStyle\":\"等额本息\",\"paymentAmountMonthly\":29358.06,\"productType\":\"不要修改测试数据!!\",\"score\":0,\"totalOverdueOrders\":0,\"vehicleAttribute\":\"新车\",\"vehicleDownPaymentPrice\":17854.6,\"vehicleEvaluationPrice\":178546,\"vehiclePrice\":178546},{\"approvalOpinions\":\"|【外部意见】2|【意见】d|【外部意见】d|【意见】d|【外部意见】d|【意见】d|【外部意见】d\",\"brandMode\":\"奥迪(进口) - A3 Sportback 1.8 豪华型\",\"contactId\":\"1516000039\",\"customerId\":\"云南分公司\",\"idNumber\":\"564564\",\"idNumberType\":\"Ent02\",\"isGps\":1,\"loanAmount\":172423.2,\"loanAmountRemain\":172423.2,\"loanAmountZrb\":172423.2,\"loanAmountZrb2\":172423.2,\"loanEndDate\":\"2017/04/26\",\"loanEndDateZrb\":\"2018/03/28\",\"loanLife\":12,\"loanLifeRemain\":8,\"loanMode\":\"租赁模式\",\"loanPrfoitZrb\":0.01,\"loanProfit\":0.00416667,\"loanStartDate\":\"2016/04/26\",\"loanStartDateZrb\":\"2017/07/28\",\"payStyle\":\"等额本息\",\"paymentAmountMonthly\":31139.86,\"productType\":\"不要修改测试数据!!\",\"score\":0,\"totalOverdueOrders\":0,\"vehicleAttribute\":\"新车\",\"vehicleDownPaymentPrice\":18945.8,\"vehicleEvaluationPrice\":189458,\"vehiclePrice\":189458}]", "pageSize":"200","batchNum":"ZRB20170221_20170221223010356","totalCnt":"535","pageNum":"3","accessToken":"Zrb0012"} , dubbo version: 2.8.4, current host: 127.0.0.1 2017-07-31 11:29:10,311 ERROR (OtherExceptionMapper.java:25) - 系统处理异常 org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token at [Source: java.io.ByteArrayInputStream@3a131c45; line: 1, column: 132] (through reference chain: com.bqzl.car.microservice.zrb.dto.ZrbCreditRequestDto["loanList"]) at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) ~[jackson-mapper-asl-1.9.12.jar:1.9.12] at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219) ~[jackson-mapper-asl-1.9.12.jar:1.9.12] at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException 看上述问题是 org.codehaus.jackson 在转换参数时报错了 ,使用alibaba 的fastjson是可以转换的,但是在dubbo中如何指定fastjson序列化方式 。请求参数为上述的request body中,请问是否有大神帮忙解决一下,谢谢

如何获取java泛型的真实Class类型?

泛型继承自接口 示例 : 想获取泛型 K 和 V 的类型 ``` public class RedisCache<K, V> implements Cache<K, V> { public V get(K key) throws CacheException { Class value_clazz = ... //想要获取泛型V的真实class //... } } ``` 我使用 clazz.getGenericSuperclass的方式获取ParameterizedType但是强转失败 ``` Class clazz = this.getClass() ; Type gs_type = clazz.getGenericSuperclass(); ParameterizedType pt = (ParameterizedType)gs_type ; ``` 发生以下异常 : java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

java泛型中的自限定类型有什么作用

java泛型中的自限定类型有什么作用?具体举个例子,一个应用场景

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

ArrayList源码分析(入门篇)

ArrayList源码分析 前言: 写这篇博客的主要原因是,在我上一次参加千牵科技Java实习生面试时,有被面试官问到ArrayList为什么查找的速度较快,插入和删除的速度较慢?当时我回答得不好,很大的一部分原因是因为我没有阅读过ArrayList源码,虽然最后收到Offer了,但我拒绝了,打算寒假学得再深入些再广泛些,下学期开学后再去投递其他更好的公司。为了更加深入理解ArrayList,也为

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

玩转springboot启动banner定义所得

最近接手了一个springboot项目,不是不熟悉这个框架,启动时打印的信息吸引了我。 这不是我熟悉的常用springboot的打印信息啊,我打开自己的项目: 还真是的,不用默认的感觉也挺高大上的。一时兴起,就去研究了一下源代码,还正是有些收获,稍后我会总结一下。正常情况下做为一个老程序员,是不会对这种小儿科感兴趣的,不就是一个控制台打印嘛。哈哈! 于是出于最初的好奇,研究了项目的源代码。看到

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

立即提问