泛型习题总结

一.新建一个泛型类具有两个泛型参数。并且满足下列条件.(已知两个类的代码)

class Person{

void test1(){

}

}

class Student extends Person{

void test2(){

}

}

a.一个泛型参数有上界限

b.两个成员变量的类型都是泛型参数

c.写一个成员方法将b中的两个成员变量赋值

d.写两个成员方法分别返回这两个成员变量的值

e.在主方法中指定泛型参数,完成对c和d一共三个成员方法的调用

f. 写一段代码证明使用泛型后,直接可以返回指定的泛型对象(即不用向下转型了)

class A<T1 extends Person,T2>{

    T1 b1;

    T2 b2;

    void setT(T1 t1,T2 t2){

        this.b1=t1;

        this.b2=t2;

    }

    T1 getT1(){

        return b1;

    }

    T2 getT2(){

        return b2;

    }

    public static void main(String[] args) {

        A<Person,Student> a=new A<>();

        a.setT(new Person(),new Student());

        Person p=a.getT1();

Student s=a.getT2();

    }

}

二.已知下列代码, 回答问题。

Class Person<T>{

T t;

void setT(T t){

①t.

}

}

  1. ①中的t能找到哪些方法

Object中的方法

2.主方法代码如下:

Person<Person> p=new Person<>();

p.setT(②);

②中能加入的对象类型有哪些?

Person和Person的子类

3.如果代码中的泛型参数上界是Person。则泛型参数如何写?并且回答①中能找到的方法

泛型参数:<T  extends  Person>

中能找到Object和Person的方法

  1. 写一个成员方法参数列表可以接受一个Person泛型类,并且泛型类参数的上界是Person

void test1(Person<? extends Person> p1){

}

  1. 写一个成员方法参数列表可以接受一个Person泛型类,并且泛型类参数的下界是Person

void test2(Person<? super Person> p2){

}

  1. 若4中参数列表变量名字为o, 则o.setT()这个方法可以传入哪些对象?

null

7.若5中参数列表变量名字为o, 则o.setT()这个方法可以传入哪些对象?

 Person或者Person的子类

三. 回答下列问题

1.为什么static方法不能使用泛型类的泛型参数

因为静态方法不需要实例化过程,泛型参数是在实例化过程中告诉的

2.泛型方法定义如下:

class A{

<E> E test(E e1,E e2){

return e1;

}

}

主方法调用:

A a=new A();

B b1=new B();

C c=new C();

B b2=a.test( b1, c);

(继承关系图如下:C是父类)

C-->B

则上述主方法代码正确么?为什么?

不正确,返回的是C类型的对象,需要向下转型B b2=(B)a.test( b1, c);或者C c1=a.test( b1, c);

在这种情况下,泛型类型 E 将被推断为其共同父类或接口,即 B 和 C 的父类或接口。在给定的代码中,B 类是 C 类的子类,所以泛型类型 E 被推断为 C 类型。

3.将2中的层级图改成B和C 没有关系,则主方法代码正确么?为什么?

不正确,返回的是Object类型的对象,需要向下转型B b2=(B)a.test( b1, c);或者Object b2=a.test( b1, c);

  1.  2中的泛型方法test 方法体中, e1.或者e2.能找到哪些方法?

Object的方法

  1.  如何改变泛型方法test,让e1或者e2能找到除了Object以外的方法?

 在泛型参数限定一个上界,

<E extends B> E test(E e1,E e2){

        return e1;

}

6.   一个泛型方法有上界和直接的以上界作为参数列的普通方法比较,有什么区别?

一个泛型方法有上界,传给参数列表中是上界的子类,直接以传的子类形式返回,在主方法中用传的类型接收不需要向下转型。

以上界作为参数列,直接以上界的形式返回需要向下转型

<E> E test(E e1,E e2){

return e1;

}

传进来e1,e2有继承关系返回类型是两者之间父类

没有继承关系返回的类型是Object

示例代码:

class A{
    <E extends C> E test(E e1){
        return e1;
    }

     C test1(C c){
        return c;
    }
}

class Entrance{
    public static void main(String[] args) {
        A a=new A();
        B b1=new B();
        C c=new C();
        B b3=a.test(b1);

        B b2=(B)a.test1(b1);
    }
}


class B extends C{

}

class C{

}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值