1、 泛型从JDK1.5之后追加到Java语言里面的,其主要目的是为了解决ClassCastException的问题,在进行对象的向下转型时,永远都存在有安全隐患。可以编译,运行错误 解决大多部分
2、而泛型的本质在于,类中的属性或方法的参数与返回值可以由对象实例化的时候动态决定。
3、方法不能重载 默认Object 警告
注: tsy.java使用了未经检查或不安全的操作。
注: 有关详细信息, 请使用 -Xlint:unchecked 重新编译。
4、
·?extends 类:设置泛型上限;|-例如:"? extends Number":表示该泛型类型只允许设置Number或者Number的子类
·? super 类: 设置泛型的下限: |-例如:"? super String":只能够使用String或其父类。
package com.msc.example;
import java.util.Arrays;
interface IPoint<S>{
public String print(S s) ;
}
class PointImpl<T> implements IPoint<T>{
private T x ;
private T y ;
public PointImpl () {} ;
public PointImpl(T x,T y) {
this.x = x ;
this.y = y ;
}
public void setX(T x){
this.x = x ;
}
public void setY(T y) {
this.y = y;
}
public T getY() {
return y;
}
public T getX() {
return x;
}
@Override
public String print(T t) {
return "泛型接口" + t ;
}
}
public class GenerPara {
public static void main(String[] args) {
// Point<Integer> point = new Point<Integer>() ; 17之后可以省略
PointImpl<Integer> point = new PointImpl<>(10,20) ;
fun(point);
IPoint<String> ipoint = new PointImpl<>();
System.out.println(ipoint.print("000") );
String str[] = fun("mmm","kkkk") ;
System.out.println(Arrays.toString(str));
Integer in[] = fun(1,2,3);
System.out.println(Arrays.toString(in));
}
//不能重载
public static void fun(PointImpl<? extends Number>temp) {
System.out.println(temp.getY());
}
public static void funB(PointImpl<? super String>temp) {
System.out.println(temp.getX());
}
public static <T> T[] fun(T ... args){
return args ;
}
}
工厂模式改进
package com.msc.example;
interface IFood{
public void eat() ;
}
class Factory{
public static <T> T getInstance(String classname) {
switch(classname){
case "bread": {
return (T) new Bread();
} case "milk" : {
return (T) new Milk();
} default:{
return null;
}
}
}
}
class Bread implements IFood{
@Override
public void eat(){
System.out.println("吃面包");
}
}
class Milk implements IFood{
@Override
public void eat() {
System.out.println("喝牛奶");
}
}
public class FactoryModel {
public static void main(String[] args) {
IFood ifood = Factory.getInstance("milk");
ifood.eat();
ifood = Factory.getInstance("bread");
ifood.eat();
}
}