class Point { // 定义坐标
private Object x;
private Object y;
public void setX(Object x) {
this.x = x;
}
public void setY(Object y) {
this.y = y;
}
public Object getX() {
return x;
}
public Object getY() {
return y;
}
}
下面重复的演示三个程序,分别使用各个不同的数据类型。
范例: 在Point类里面保存整形数据
public class MainClass {
public static void main(String[] args) {
// 第一步:设置数据
Point p = new Point();
p.setX(10);
p.setY(20);
// 第二步:取出数据
int x = (Integer) p.getX();
int y = (Integer) p.getY();
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
范例: 使用小数
public class MainClass {
public static void main(String[] args) {
// 第一步:设置数据
Point p = new Point();
p.setX(10.2);
p.setY(20.3);
// 第二步:取出数据
double x = (Double) p.getX();
double y = (Double) p.getY();
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
范例: 使用字符串
public class MainClass {
public static void main(String[] args) {
// 第一步:设置数据
Point p = new Point();
p.setX("东经100度");
p.setY("北纬20度");
// 第二步:取出数据
String x = (String) p.getX();
String y = (String) p.getY();
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
public class MainClass {
public static void main(String[] args) {
// 第一步:设置数据
Point p = new Point();
p.setX("东经100度");
p.setY(10);
// 第二步:取出数据
String x = (String) p.getX();
String y = (String) p.getY();
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at com.alpha.MainClass.main(MainClass.java:26)
// 此时设置的T在Point类定义上只表示一个标记,在使用的时候需要为其设置具体的类型
class Point<T> { // 定义坐标, T -> Type
private T x; // 此属性的类型不知道,由Point类使用时动态决定
private T y;
public void setX(T x) {
this.x = x;
}
public void setY(T y) {
this.y = y;
}
public T getX() {
return x;
}
public T getY() {
return y;
}
}
在使用Point类的时候才去设置标记的内容,也就是设置了类中的属性的类型。
范例: 设置为String
public class MainClass {
public static void main(String[] args) {
// 第一步:设置数据
Point<String> p = new Point<String>();
p.setX("东经100度");
p.setY("北纬20度");
// 第二步:取出数据,由于接受的类型就是String所以不需要强制转型
String x = p.getX();
String y = p.getY();
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
public class MainClass {
public static void main(String[] args) {
// 第一步:设置数据
Point<Integer> p = new Point<Integer>();
p.setX(10);
p.setY(20);
// 第二步:取出数据
int x = p.getX();
int y = p.getY();
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
public class MainClass {
public static void main(String[] args) {
// 第一步:设置数据
Point p = new Point(); // 表示默认使用Object进行类型的设置
p.setX(10);
p.setY(20);
// 第二步:取出数据
int x = (Integer) p.getX();
int y = (Integer) p.getY();
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
从JDK1.7开始可以简化声明泛型。
public class MainClass {
public static void main(String[] args) {
// 第一步:设置数据
Point<Integer> p = new Point<>(); // JDK1.7之后实例化的泛型可以省略
p.setX(10);
p.setY(20);
// 第二步:取出数据
int x = p.getX();
int y = p.getY();
System.out.println("x坐标:" + x + ",y坐标:" + y);
}
}
通配符
为了更好地理解通配符的作用,下面首先来观察一个程序。
package com.alpha;
class Message<T> {
private T msg;
public void setMsg(T msg) {
this.msg = msg;
}
public T getMsg() {
return msg;
}
}
public class MainClass {
public static void main(String[] args) {
Message<String> m = new Message<String>();
m.setMsg("Hello World!");
fun(m);
}
public static void fun(Message<String> temp) {
System.out.println(temp.getMsg());
}
}
package com.alpha;
class Message<T extends Number> {
private T msg;
public void setMsg(T msg) {
this.msg = msg;
}
public T getMsg() {
return msg;
}
}
public class MainClass {
public static void main(String[] args) {
Message<Integer> m = new Message<Integer>();
m.setMsg(100);
fun(m);
}
public static void fun(Message<? extends Number> temp) { // 不能够设置但是可以取出
System.out.println(temp.getMsg());
}
}
如果设置了非Number或者是其子类的话,那么将出现语法错误。
范例: 设置泛型的下限
package com.alpha;
class Message<T> {
private T msg;
public void setMsg(T msg) {
this.msg = msg;
}
public T getMsg() {
return msg;
}
}
public class MainClass {
public static void main(String[] args) {
Message<String> m = new Message<String>();
m.setMsg("Hello");
fun(m);
}
public static void fun(Message<? super String> temp) { // 不能够设置但是可以取出
System.out.println(temp.getMsg());
}
}