泛型应用



一 、泛型的基本应用

  泛型可以解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中的某个属性的类型或者是某个方法的返回值及参数类型


二 、泛型的定义

//泛型类的定义,例如:
class Point<T>   //T 表示此类型由外部调用本类时指定,这里使用任意字母都可以,之所以用 T,是因为T是type的缩写,表示类型,比较好理解

//泛型对象的定义,例如:
Point<String> p = new Point<String>();   //指定String数据类型

三 、使用泛型修改坐标类Point

class Point<T>{
	private T x ;		// 表示X坐标
	private T y ;		// 表示Y坐标
	public void setX(T x){
		this.x = x ;
	}
	public void setY(T y){
		this.y = y ;
	}
	public T getX(){
		return this.x ;
	}
	public T getY(){
		return this.y ;
	}
};

public class GenericsPoint{
	public static void main(String args[]){
		Point<Integer> p = new Point<Integer>() ;
		p.setX(10) ;		// 利用自动装箱操作:int --> Integer
		p.setY(20) ;		// 利用自动装箱操作:int --> Integer
		int x = p.getX() ;	// 自动拆箱
		int y = p.getY() ;	// 自动拆箱
		System.out.println("整数表示,X坐标为:" + x) ;
		System.out.println("整数表示,Y坐标为:" + y) ;
	}
};

程序运行结果:
在这里插入图片描述
当设置的内容与指定的类型不一致时,编译将发生错误

public class GenericsPoint{
	public static void main(String args[]){
		Point<Integer> p = new Point<Integer>() ;
		p.setX(10) ;		// 利用自动装箱操作:int --> Integer
		p.setY("北纬220度") ;		// 编译错误
		int x = p.getX() ;	// 自动拆箱
		int y = p.getY() ;	// 自动拆箱
		System.out.println("整数表示,X坐标为:" + x) ;
		System.out.println("整数表示,Y坐标为:" + y) ;
	}
};

在这里插入图片描述

四 、使用泛型使程序操作更加安全

提问:为什么使用泛型,而不使用Object类接收对象?
回答:使用泛型将使程序的操作更加安全
使用Object类接收对象时,当设置的内容与指定的类型不一致,程序 运行 发生类转换异常
在这里插入图片描述
使用泛型时,当设置的内容与指定的类型不一致,程序 编译 不通过

在这里插入图片描述

五 、泛型应用中的构造方法

class Construction<T>{
   private T name;
   public Construction(T name){
       this.name = name;
   }

   public T getName() {
       return name;
   }

   public void setName(T name) {
       this.name = name;
   }
}
public class ConstructionDemo {
   public static void main(String[] args) {
       Construction<String> cst = new Construction<String>("hello");
       System.out.println(cst.getName());
   }
}

程序运行结果:
在这里插入图片描述

六 、指定多个泛型类型

class Person<S,I>{
    private S name;
    private I age;

    public Person(S name, I age) {
        this.name = name;
        this.age = age;
    }

    public S getName() {
        return name;
    }

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

    public I getAge() {
        return age;
    }

    public void setAge(I age) {
        this.age = age;
    }
}

public class GenericsDemo05 {
    public static void main(String[] args) {
        Person<String,Integer> per = new Person<String,Integer>("Java",20);
        System.out.println("姓名:" + per.getName() + " 年龄:" + per.getAge());
    }
}

程序运行结果:
在这里插入图片描述

Scala中的(Generics)是一种强大的工具,允许开发者编写可重用的代码,同时保持类型安全。在Scala中有多种应用场景,以下是一些常见的应用场景: 1. **集合类**: Scala的集合类(如List、Set、Map等)广使用了。例如,List[Int]表示一个包含整数的列表,List[String]表示一个包含字符串的列表。通过,集合类可以存储任意类型的元素,而不会丢失类型信息。 ```scala val intList: List[Int] = List(1, 2, 3) val stringList: List[String] = List("a", "b", "c") ``` 2. **函数参数**: 可以用于定义接受任意类型参数的函数。例如,定义一个通用的排序函数,可以对任何类型的列表进行排序。 ```scala def sortList[T](list: List[T])(implicit ord: Ordering[T]): List[T] = { list.sorted } val sortedIntList = sortList(intList) val sortedStringList = sortList(stringList) ``` 3. **类定义**: 在定义类时,可以使用来创建通用的数据结构。例如,定义一个通用的键值对类,可以存储任意类型的键和值。 ```scala class Pair[K, V](val key: K, val value: V) { def getKey: K = key def getValue: V = value } val pair = new Pair(1, "one") println(pair.getKey) // 输出: 1 println(pair.getValue) // 输出: one ``` 4. **类型约束**: 还可以用于在编译时对类型进行约束。例如,定义一个函数,要求传入的参数必须是某个类的子类。 ```scala def printLength[T <: { def length: Int }](obj: T): Unit = { println(obj.length) } printLength("hello") // 输出: 5 printLength(List(1, 2, 3)) // 输出: 3 ``` 5. **隐式参数**: 可以与隐式参数结合使用,提供更灵活的代码。例如,定义一个通用的函数,依赖于隐式参数来实现特定的功能。 ```scala def printValue[T](value: T)(implicit ev: T => String): Unit = { println(value) } implicit def intToString(i: Int): String = i.toString printValue(123) // 输出: 123 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值