一.新建一个泛型类具有两个泛型参数。并且满足下列条件.(已知两个类的代码)
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.
}
}
- ①中的t能找到哪些方法
Object中的方法
2.主方法代码如下:
Person<Person> p=new Person<>();
p.setT(②);
②中能加入的对象类型有哪些?
Person和Person的子类
3.如果代码中的泛型参数上界是Person。则泛型参数如何写?并且回答①中能找到的方法
泛型参数:<T extends Person>
①中能找到Object和Person的方法
- 写一个成员方法参数列表可以接受一个Person泛型类,并且泛型类参数的上界是Person
void test1(Person<? extends Person> p1){
}
- 写一个成员方法参数列表可以接受一个Person泛型类,并且泛型类参数的下界是Person
void test2(Person<? super Person> p2){
}
- 若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);
- 2中的泛型方法test 方法体中, e1.或者e2.能找到哪些方法?
Object的方法
- 如何改变泛型方法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{
}
1613





