Java泛型 继承中类型变量的关系

通过例子来看泛型类在继承中过程中类型变量应该具有怎样的关系。

首先给出几个辅助类:

package generic;
public class Animal {    }
package generic;

public class Person extends Animal {
	private String name;

	public Person(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}

	public Integer printAndReturn() {
		return 1;
	}
}
package generic;

public class Student extends Person {
	private String studentNumber;

	public Student(String name, String studentNumber) {
		super(name);
		this.studentNumber = studentNumber;
	}

	public String getStudentNumber() {
		return studentNumber;
	}

	public void setStudentNumber(String studentNumber) {
		this.studentNumber = studentNumber;
	}

	@Override
	public String toString() {
		return "Student [studentNumber=" + studentNumber + ", name="
				+ getName() + "]";
	}

}
package generic;

public class Building {
	private String name;

	public Building(String name) {
		super();
		this.name = name;
	}	

}
package generic;

/**
 * @version 1.00 2004-05-10
 * @author Cay Horstmann
 */
public class Pair<T extends Person>
{
   private T first;
   private T second;

   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; }

}

1.子类的类型变量表示的范围必须与父类一样或者是父类的子集

package generic;

public class PariSon<T extends Person> extends Pair<T> {

}

public class PariSon<T extends Student> extends Pair<T> {
}

2.当父类用具体类型代替类型变量时,具体变量必须是类型变量表示的范围内的一个元素

package generic;

public class PariSon extends Pair<Person> {
}

package generic;

public class PariSon extends Pair<Student> {
}
时间: 2024-10-17 11:08:57

Java泛型 继承中类型变量的关系的相关文章

java之继承中的构造方法

继承中的构造方法  1.子类的构造过程中必须调用其基类的构造方法. 2.子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法. 2.1.使用this(argument_list)调用本类的另外构造方法.  2.2.如果调用super,必须写在子类构造方法的第一行. 3.如果子类的构造方法中没有显示的调用基类的构造方法,则系统默认调用基类的无参数构造方法. 4.如果子类构造方法中既没有显示调用基类构造方法,而基类又没有无参数的构造方法,则编译出错. class

201671010145 2016-2017 《Java程序设计》java的继承中什么叫方法覆盖,是如何实现的?

方法覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用.最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而在实现时,就需要实现接口声明的所有方法.除了这个典型的用法以外,在继承中也可能会在子类覆盖父类中的方法.在覆盖要注意以下的几点:1.覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果:2.覆盖的方法的返回值必须和被覆盖的方法的返回一致:3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类:4.被覆盖的方法不

57 面向对象继承中构造方法的关系

1 class Demo1_Extends{ 2 public static void main(String[] args) { 3 Dog d = new Dog(); 4 } 5 } 6 7 class Animals extends Object{ 8 public Animals(){ 9 super() // 默认继承 Object类 10 System.out.println("父类无参构造方法"); 11 } 12 } 13 14 class Dog extends A

java在继承中父类的成员变量是否会被子类所覆盖

假如 父类 int num =7:子类 int num =9:父类是否会被子类所覆盖? 给你看两个例子: 第一个例子: 第二个例子: 这两个例子的区别只有一句话   由此证明了子类从父类继承的时候  如果有同名的成员变量 默认情况下 父类的成员变量是被屏蔽的   如果你非要调用父类的成员变量  请使用super关键字

c++  与  java  中的 继承

C++ 代码: #include <iostream> #include <string> using namespace std; class Parent { public: void fun() {cout<<"Parent fun"<<endl;} void fun(int a) {cout<<"Parent fun int a"<<endl;} void fun(int a, int

Java多态机制和继承中重写重载

关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定.因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上

2.java泛型基础

Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter).声明的类型参数在使用时用具体的类型来替换.泛型最主要的应用是在JDK 5中的新集合类框架中.对于泛型概念的引入,开发社区的观点是褒贬不一.从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多明显的错误.而从不好的地方来说,为了保证与旧有版本的兼容性,Java泛型的实现上存在着一些不够优雅的地

牛刀小试 - 浅析Java的继承与动态绑定

什么是继承? 继承也是面向对象的重要特性之一.顾名思义,继承就是指从已有的类中派生出新类的动作.新的类能吸收已有类的数据属性和行为,并能扩展新的能力. 而通俗一点的来说,就是指Java中可以通过继承的方式,从现有的类派生出新的类.该现有类被称为超类(父类),而派生出的新类就被称为子类(派生类). 首先,子类访问继承超类当中的所有非私有的方法和成员变量:其次,还可以在父类原有的成员的基础上添加一些新的方法和域,或者对父类的方法进行覆写(override). 所有通常也这样讲:父类是子类的一般化表现

Java基础继承与多态

Java基础第九天 继承概述 引入 首先我来写两个代码: //定义学生类 class Student {     public void study(){ System.out.println("在教室学习"); } } //定义老师类 class Teacher { public void teach(){ System.out.println("在教室教书"); } } 我们观察上面两个代码: 发现name,age成员变量,以及getXxx()/setXxx()