文档章节

泛型-自定义类上的泛型,方法的泛型

architect刘源源
 architect刘源源
发布于 05/28 20:45
字数 853
阅读 65
收藏 0
package com.atguigu.javase.generic;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

// 自定义泛型类, A只能是类类型
class Person<A> { // A在这里表示它是某种类型, 类型的形参, 在本类中就可以直接使用A这个类型.
	// A类型在创建对象时指定.
	// 如果A类型在创建对象时,并未确定的指定, 它就是Object类型, 类型不安全了
	// 泛型类型隶属于对象的, 不同的对象在创建时指定的泛型类型可以不一样
	
	private String name;
	private A info;
	
	public Person() {
	}

	public Person(String name, A info) {
		super();
		this.name = name;
		this.info = info;
	}
	
	public void setInfo(A info) {
		this.info = info;
	}
	
	public A getInfo() {
		return info;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return name;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", info=" + info + "]";
	}
	
	/* 静态成员不可以使用泛型类型
	public static void test(A a) {
		
	}*/
	
	/**
	 * 泛型方法, 方法中的泛型类型在方法的返回值之前声明<泛型的类型参数>
	 * 泛型方法必须在形参中指定好特定的类型, 否则泛型方法中的泛型类型永远是Object
	 * 泛型方法中的泛型类型究竟是什么, 由实参来决定.所以是在方法的每一次调用时才能确定的.
	 * 如果实参是null, 则无法确定泛型类型, 只能是Object类型了.
	 * @return
	 */
	public <B> B testB(B b) {
		return null;
	}
}

class A<X> {
	X x;
	
	public X getX() {
		return x;
	}
}
class B extends A {} // 子类在继承时并未指定X的具体类型, 所以永远是Object
class C extends A<String> {} // 子类在继承时直接写死父类的泛型类型, 在子类中X类型永远是一致,不变的
class C2 extends A<Double> {}
class D<X> extends A<X> {} // 子类在继承父类时仍然保持泛型类型的不确定性.

public class GenericTest {
	
	@Test
	public void test6() {
		B b = new B();
		Object x = b.getX();
		
		C c = new C();
		String x2 = c.getX();
		
		D d = new D();
		Object x3 = d.getX();
		D<Integer> d2 = new D<Integer>();
		Integer x4 = d2.getX();
		String x5 = new D<String>().getX();
	}
	
	@Test
	public void test5() {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < 10; i++) {
			list.add((int)(Math.random() * 20));
		}
		System.out.println(list);
		
		Object[] array = list.toArray();
		for (Object object : array) {
			System.out.println(object);
		}
		
		System.out.println("**********************");
		
		Integer[] array2 = list.toArray(new Integer[] {});
		for (Integer integer : array2) {
			System.out.println(integer);
		}
	}
	
	@Test
	public void test4() {
		Person<String> person = new Person<String>("张三", "北京");
		Integer testB = person.testB(30);
		String testB2 = person.testB("男");
		Boolean testB3 = person.testB(false);
		Object testB4 = person.testB(null); // 当实参的类型无法确定时, 泛型方法中的类型就是Object
	}
	
	@Test
	public void test3() {
		List<Integer> list1 = new ArrayList<Integer>();
		List<Double> list2 = new ArrayList<Double>();
	}
	
	@Test
	public void test2() {
		// 在这个对象中的A类型就固定是String类型
		Person<String> person = new Person<String>("张三", "北京"); // String在创建对象时,会作为类中的A类型的具体类型
		String info = person.getInfo();
		System.out.println(info);
		
		//person.setInfo(30);
		
		//new Person<Integer>("李四", "上海");
		Person<Integer> person2 = new Person<Integer>("李四", 40);
		Integer info2 = person2.getInfo();
		System.out.println(info2);
	}
	
	@Test
	public void test1() {
		Person person = new Person("张三", 30); // 理论上A类型就是Integer了, 但是没有指定
		Object info = person.getInfo();
		System.out.println(info);
		person.setInfo("男"); // 在这里体现了类型不安全, 因为理论上类型是Integer,但是实际给定的是String
		
		Person person2 = new Person("李四", "女");
		Object info2 = person2.getInfo();
		System.out.println(info2);
	}
}	

静态方法不能使用泛型,因为静态方法隶属于类,而泛型是绑定到对象上的

对于更精确的类型确定,可以使用泛型方法

© 著作权归作者所有

architect刘源源

architect刘源源

粉丝 164
博文 518
码字总数 922746
作品 0
浦东
程序员
私信 提问
Java泛型的介绍和定义

一、自定义泛型方法 package com.java.b; import org.junit.Test; /** * Java 方法 自定义泛型 * @author TS * /public class IGenericMethod { /* * 方法声明泛型 * <T>:使用这个泛型T * @......

AAASSSSddd
2016/03/31
35
0
Java基础巩固笔记(2)-泛型

Contents java基础巩固笔记(2)-泛型 术语 "?"通配符 自定义泛型方法 自定义泛型类 泛型和反射 本文对泛型的基本知识进行较为全面的总结,并附上简短的代码实例,加深记忆。 泛型:将集合中的...

卟想苌亣
2017/11/23
0
0
Java泛型(目录)

概述 一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.虽然可以用多态,用基类类型作为参数,接受其子类的对象,但是拘泥于单继承体系确实不够灵活,局限太多. 在Java SE5版...

我叫张凯
2016/01/11
126
0
Java泛型:泛型类、泛型接口和泛型方法

根据《Java编程思想 (第4版)》中的描述,泛型出现的动机在于: 有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类。 泛型类 容器类应该算得上最具重用性的类库之一...

huojiao2006
2017/01/03
0
0
Java编程细节-Java泛型总结

泛型 泛型就是参数化类型 * 适用于多种数据类型执行相同的代码 * 泛型中的类型在使用时指定 * 泛型归根到底就是“模版” 优点:使用泛型时,在实际使用之前类型就已经确定了,不需要强制类型...

远方的梦Java
2018/08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

优雅的关闭Spring Boot

优雅的关闭Spring Boot 1、实现 TomcatConnectorCustomizer 接口拿到Tomcat的连接获取 Tomcat连接池 2、实现 ApplicationListener<ContextClosedEvent> 监听服务器关闭事件,注册JVM钩子函数...

sowhat
今天
2
0
Python3-Web开发

简介 Web开发框架 什么是Web框架? Web应用程序框架或简单的Web框架表示一组库和模块,使Web应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。 virtualenv是一个虚拟...

wuxinshui
今天
3
0
使用技媒体实践编写发布博客

技媒体实践博客 CSDN OSChina 知乎 简书 思否 掘金 51CTO

晨猫
今天
2
0
Lucene

1、什么是全文检索 数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据。 结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。 非结构化数据:指不定长或无固...

榴莲黑芝麻糊
昨天
5
0
python到setuptools、pip工具的安装

python安装 基础开发库   apt-get install gcc  apt-get install openssl libssl-dev 安装数据库和开发库   apt-get install mysql-server libmysqld-dev python环境   下载地址...

问题终结者
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部