泛型使用

一直不是很明白泛型中的?和K、V的区别,查了一些资料,自己做了一些理解:

1.K、V决定了这个结构只能使用一种类型,而?则表示该结构可以接受满足条件的所有类型的对象

2.在一个类实例化的时候可以定义该类固定的一个泛型,如用A、B表示,则需要用到这个泛型的方法和成员变量可以直接使用它,指的就是那个在实例化该类时定义的类型。

3.对于方法,想要使用泛型则?和K、V等字母表示都是可以的,如set方法,使用V表示泛型,则需要在方法申明时特别定义,写在返回值之前,如果使用?来表示泛型则在要使用的地方进行定义,如set2方法。

4.在定义成员变量时如果要使用泛型,必须使用?,如果要使用字母表示,这个字母必须是类在实例化的时候定义的,即之前讲的不能在定义成员变量的时候临时定义一个字母作泛型。

建议:直观理解就是字母作泛型应该是在类实例化的时候定义出来,如果没有这样的设置,还是用?统一的好。

public class Generics<A,B> {
	
	private Map<String, Test<? extends Math>> map = new HashMap<String, Test<? extends Math>>();
	private Map<Integer, ? extends String> map2 = new HashMap<Integer, String>();
	private List<A> list = new ArrayList<A>();
	private List<B> list3 = new ArrayList<B>();
	
	
//	private List<T> list2 = new ArrayList<T>();//错误,不能在申明成员变量的时候去定义泛型T的类型,必须在类实例化的时候
	
	public <T extends Exception> T get() {
		return null;
	}
	
	public A get2() {
		return null;		
	}
	
	public <V extends String> void set(List<V> list) {
		System.out.println(list.get(0).getClass().getName());
	}
	
	public void set2(List<? extends String> list) {
		System.out.println(list.get(0).getClass().getName());
	}
	
//	private <A extends String> List<A> list = new ArrayList<A>();
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("aaa");
		Generics<Integer,String> demo = new Generics<Integer,String>();
		demo.set(list);
		demo.set2(list);
	}

}

class Test<T> {
	
}


泛型(Generics)是一种在编程语言中实现参数化类型的技术,可以让我们编写更加灵活和通用的代码。下面是一个泛型使用案例: 假设我们有一个需求,需要实现一个通用的栈(Stack)数据结构,可以存储任何类型的元素。我们可以使用泛型来实现这个通用的栈数据结构。以下是一个基于Java的示例代码: ```java public class Stack<T> { private ArrayList<T> items; public Stack() { items = new ArrayList<T>(); } public void push(T item) { items.add(item); } public T pop() { if (items.isEmpty()) { throw new RuntimeException("Stack is empty"); } return items.remove(items.size() - 1); } public boolean isEmpty() { return items.isEmpty(); } } ``` 在上面的代码中,我们使用了一个类型参数 `T`,它代表任何类型。我们在类的定义中使用了 `<T>` 来声明这个类是一个泛型类,它可以接受任何类型的元素。在类的内部,我们使用 `T` 来代表元素的类型。我们将元素存储在一个 `ArrayList<T>` 中,这个 `ArrayList` 可以存储任何类型的元素。 我们定义了三个方法:`push()`、`pop()` 和 `isEmpty()`。`push()` 方法用于将元素压入栈中,`pop()` 方法用于弹出栈顶元素,并从栈中移除它,`isEmpty()` 方法用于判断栈是否为空。 使用泛型,我们可以使用这个通用的栈数据结构来存储任何类型的元素,例如: ```java Stack<Integer> intStack = new Stack<Integer>(); intStack.push(1); intStack.push(2); intStack.push(3); intStack.pop(); // 返回 3 intStack.pop(); // 返回 2 Stack<String> strStack = new Stack<String>(); strStack.push("Hello"); strStack.push("World"); strStack.pop(); // 返回 "World" ``` 在上面的示例代码中,我们分别使用了 `Stack<Integer>` 和 `Stack<String>` 来存储整数和字符串类型的元素。由于使用泛型,这个通用的栈数据结构可以存储任何类型的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值