简介
泛型从JDK1.5之后追加到Java语言里面的,其主要目的是为了解决ClassCastException的问题,在进行对象的向下转型时都可能存在有安全隐患,而Java希望通过泛型可以慢慢解决掉此类问题。
如果要想避免项目之中出现”ClassCastException“最好的做法就是直接回避对象的强制转换,所以在JDK1.5之后提供有泛型技术,而泛型的本质在于,类中的属性或方法的参数与返回值的类型可以由对象实例化的时候动态决定。那么此时就需要在类定义的时候明确的定义占位符(泛型标记)。
关于默认的泛型类型
‒ 由于泛型是属于JDK1.5之后的产物,但是在这之前已经由不少内置的程序类或是接口广泛的应用在了项目开发中,于是为了保证这些类或接口追加了泛型之后,原始的程序类依然可以使用,所以如果不设置泛型类型时,自动将使用Object作为类型,以保证程序的正常执行,但是在编译的过程之中会出现警告信息。
public class Salary <T>{
private T salary;
public T getSalary() {
return salary;
}
public void setSalary(T salary) {
this.salary = salary;
}
}
public class SalaryTest {
public static void main(String[] args) {
Salary salary = new Salary();
Salary salary1 = new Salary();
salary.setSalary(100000);
salary1.setSalary("十万元");
System.out.println(salary.getSalary());
System.out.println(salary1.getSalary());
}
}
泛型的使用注
意点:
‒ 泛型之中只允许设置引用类型,如果现在要操作基本类型必须使用包装类
Point point = new Point(); // 错误
‒ 从JDK1.7开始,泛型对象实例化可以简化为
Point point = new Point<>();
使用泛型可以解决大部分的类对象的强制转换处理,这样的程序才是一个合理的设计
泛型通配符
虽然泛型帮助开发者解决了一系列的对象的强制转换所带来的安全隐患,但是从另一方角度来讲,泛型也带来了一些新的问题:引用传递处理。所以此时需要找一种方案:可以接收所有的泛型类型,并且不能够修改里面的数据(允许获取),那么就需要通过通配符"?"来解决。
class Message2<T extends Number>{
private T content ;
public void setContent(T content){
this.content = content;
}
public T getContent(){
return this.content;
}
}
public class JavaDemo4{
public static void main(String args[]){
Message2<Integer> msga = new Message2<Integer>();
msga.setContent(10);
fun(msga);
}
public static void fun(Message2<? extends Number> temp){
System.out.println(temp.getContent());
}
}
在"?“这个通配符的基础之上实际上还提供由两类小的通配符
‒ ? extends 类: 设置泛型的上线
‒ 例如:定义”? extends Number":表示该泛型只允许设置Number或Number的子类
‒ ? super 类 :设置泛型的下限
‒ 例如: 定义 “? super String”:只能使用String或其父类
泛型接口
泛型除了可以在类上定义之外也可以直接在接口之中进行使用
interface IMessage<T>{
public String echo(T t);
}
public class JavaDemo{
public static void main(String args[]){
}
}
`
``
子类可以继续进行泛型定义
```java
class MessageImpl<S> implements IMessage<S>{
public String echo(S t){
return "[echo]"+t;
}
}
子类可以直接定义除具体的泛型类型
class MessageImpl<Stirng> implements IMessage<String>{
public String echo(String t){
return "[echo]"+t;
}
}
泛型方法
如果将泛型标记写在了方法上,那么这样的方法就被称为泛型方法,但是需要注意的是,泛型方法不一定非要出现在泛型类之中
eg:利用泛型改进工厂
interface IMessage{
public void send(String str);
}
class MessageImple implements IMessage {
public void send (String str){
System.out.println("消息发送:"+str);
}
}
class Factory {
public static <T> T getInstance(String className){
if("messageImpl".equalsIgnoreCase(className)){
return new MessageImpl();
}
return null;
}
}
public class JavaDemo{
public static void main(String args[]){
IMessage msg = Factory.getInstance("messageImpl");
}
}