在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ Java 泛型筆試問(wèn)題?

Java 泛型筆試問(wèn)題?

代碼:

public class Pair<T> {

    private T t1;
    private T t2;
    
    public T getT1() {
        return t1;
    }
    public void setT1(T t1) {
        this.t1 = t1;
    }
    public T getT2() {
        return t2;
    }
    public void setT2(T t2) {
        this.t2 = t2;
    }
}

public class User {

    private String name;
    private String sex;
    private Integer age;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

public class  Twins extends Pair<User> {

    @Override
    public void setT1(User t1) {
        if (t1 != null) {
            super.setT1(t1);
        }
    }

    @Override
    public void setT2(User t2) {
        if (t2 != null) {
            super.setT2(t2);
        }
    }
}

問(wèn)題描述:虛擬機(jī)會(huì)將 Pair進(jìn)行類型擦除,擦出后類型變量將替換為 Object,那么 Twins 類重寫的方法 void setT1(User t1)void setT2(User t2)中參數(shù)會(huì)擦出為 Object嗎?為什么?

回答
編輯回答
半心人

Twins的方法參數(shù)User類型不會(huì)被擦除, 因?yàn)橐呀?jīng)做了類型綁定.

如果執(zhí)行new Twins().setT1(new Object())
會(huì)報(bào)如下錯(cuò):

Twins Caught: java.lang.ClassCastException: java.lang.Object cannot be
cast to User java.lang.ClassCastException: java.lang.Object cannot be
cast to User at Twins.setT1(temp.groovy) at Pair$setT1.call(Unknown
Source)

官方文檔原文是這么寫的:

Type Erasure Generics were introduced to the Java language to provide
tighter type checks at compile time and to support generic
programming. To implement generics, the Java compiler applies type
erasure to:

Replace all type parameters in generic types with their bounds or
Object if the type parameters are unbounded. The produced bytecode,
therefore, contains only ordinary classes, interfaces, and methods.
Insert type casts if necessary to preserve type safety. Generate
bridge methods to preserve polymorphism in extended generic types.
Type erasure ensures that no new classes are created for parameterized
types; consequently, generics incur no runtime overhead.

參考:
https://docs.oracle.com/javas...

@潘金蓮的答案更確切些

2017年10月20日 00:23
編輯回答
尕筱澄

對(duì)泛型擦除未做研究,你可以看看 https://www.cnblogs.com/xll10... 希望對(duì)你有幫助

2018年2月3日 21:18
編輯回答
礙你眼

父類Pair進(jìn)行類型擦除,擦出后類型變量將替換為Object,子類 Twins 類重寫的方法 void setT1(User t2)及 void setT2(User t2)不會(huì)被擦出為Object,但這樣參數(shù)列表變了,不是重寫了,所以子類Twins自動(dòng)生成了兩個(gè)方法setT1(java.lang.Object)和setT2(java.lang.Object)方法重寫父類兩個(gè)方法,在里面調(diào)用void setT1(User t2)及 void setT2(User t2)這兩個(gè)方法,所以子類Twins是有四個(gè)方法.

2018年7月14日 07:27