package com.genericity;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class GenericityTest {
public static void main(String[] args) {
List persons = new ArrayList();
persons.add("hhh");
persons.add("sss");
persons.add("aaa");
persons.add(19);
// persons.forEach(new Consumer() {
// @Override
// public void accept(Object person) {
// System.out.println(person);
// }
// });
persons.forEach(person -> System.out.println(((String) person).length()));
}
}
package com.genericity;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class GenericityTest {
public static void main(String[] args) {
List<String> persons = new ArrayList<String>();
persons.add("hhh");
persons.add("sss");
persons.add("aaa");
persons.forEach(person -> System.out.println(((String) person).length()));
}
}
Map<String,Integer> persons = new HashMap<String ,Integer>();
persons.put("ssss",38);
persons.put("aaaa",32);
persons.put("vvvv",33);
persons.put("zzzz",34);
persons.forEach((key,value) -> System.out.println(key+"="+value));
1、自定义泛型
Iterator对象定义泛型
Map定义泛型
我们可以看到,上面自定义泛型的时候,我们就是在类名的后面加上类型的替代符
比如T,K,V。我们在使用的时候直接把这些T,K,V,替换成对应的类型名称就好;
package com.genericity;
public class MyDefineTest {
private static class A<T>{
private T info;
public T getInfo() {
return info;
}
public A(T info) {
this.info = info;
}
}
public static void main(String[] args) {
A<String> a = new A<>("ssd");
System.out.println(a.getInfo());
A<Integer> a1 = new A<>(2);
System.out.println(a1.getInfo());
}
}
下面代码不可以
private static class B extends A<T>{
public B(T info) {
super(info);
}
}
可以用如下方式使用
package com.genericity;
public class MyDefineTest {
private static class A<T>{
private T info;
public T getInfo() {
return info;
}
public A(T info) {
this.info = info;
}
}
private static class B extends A<String >{
public B(String info) {
super(info);
}
}
public static void main(String[] args) {
B b = new B("sss");
System.out.println(b.getInfo());
}
}
但是,有时候,我们定义一个子类的时候,我们还是无法判断泛型的类型:
package com.genericity;
public class MyDefineTest {
private static class A<T>{
private T info;
public T getInfo() {
return info;
}
public A(T info) {
this.info = info;
}
}
private static class B<T> extends A<T >{
public B(T info) {
super(info);
}
}
public static void main(String[] args) {
B<String> b = new B<>("sss");
System.out.println(b.getInfo());
}
}
3、并不存在泛型类
package com.genericity;
public class MyDefineTest {
private static class A<T>{
private T info;
public T getInfo() {
return info;
}
public A(T info) {
this.info = info;
}
}
private static class B<T> extends A<T >{
public B(T info) {
super(info);
}
}
public static void main(String[] args) {
A<String> a1 = new A<>("sss");
A<Integer> a2 = new A<>(33);
System.out.println(a1.getClass());
System.out.println(a2.getClass());
System.out.println(a1.getClass().equals(a2.getClass()));
}
}
运行出来我们发现a1.getClass()和a2.getClass()相等,那证明不存在泛型类
package com.genericity;
import java.util.ArrayList;
import java.util.List;
public class WildcsrdProblemTest {
private static void test(List<Object> list){
for (Object o :list){
System.out.println(o);
}
}
public static void main(String[] args) {
List<String > persons = new ArrayList<>();
persons.add("hhh");
persons.add("zzz");
persons.add("aaa");
test(persons);
}
}
解决方案修改代码
package com.genericity;
import java.util.ArrayList;
import java.util.List;
public class WildcsrdProblemTest {
private static void test(List<?> list){
for (Object o :list){
System.out.println(o);
}
}
public static void main(String[] args) {
List<String > persons = new ArrayList<>();
persons.add("hhh");
persons.add("zzz");
persons.add("aaa");
test(persons);
}
}
上面的List<?>,其中的?表示的就是一个通配符,表示可以匹配任何类型。在使用的时候,通配符里面的元素,我们用object类型
package com.genericity;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class WildcardTest {
private static class Animal{
public void say(){
System.out.println("I am animal i will speak");
}
}
private static class Dog extends Animal{
@Override
public void say(){
System.out.println("I am a dog wangwangwang !");
}
}
private static class Cat extends Animal{
@Override
public void say(){
System.out.println("I am a cat maoamoamao !");
}
}
//List<? extends Animal>限制我们的List中的泛型必须是Animal或者是Animal 的子类
private static void animalSay(List<? extends Animal> animals){
animals.forEach(animal -> animal.say());
}
//如果在Apple<T extends Number>在下面的String类型的泛型使用时就会报错,extends 类 &接口
private static class Apple<T extends Number & Serializable>{
private T info;
public Apple(T info) {
this.info = info;
}
public T getInfo() {
return info;
}
public void setInfo(T info) {
this.info = info;
}
}
public static void main(String[] args) {
List<Animal> animals = new ArrayList<>();
animals.add(new Dog());
animals.add(new Cat());
animalSay(animals);
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
animalSay(dogs);
List<Cat> cats = new ArrayList<>();
cats.add(new Cat());
animalSay(cats);
//
// List<String> persons = new ArrayList<>();
// persons.add("dadsada");
// animalSay(persons);
// Apple<String> apple = new Apple<>("I am an Apple");
//System.out.println(apple.getInfo());
Apple<Integer> apple1 = new Apple<>(49);
System.out.println(apple1.getInfo());
}
}
package com.genericity;
import java.util.ArrayList;
import java.util.List;
public class MethodTest {
private static void arrayToList(Object[] objs, List<Object> list){
for (Object obj : objs) {
list.add(obj);
}
}
public static void main(String[] args) {
Object[] strArr = {"aaa","bbb","ccc"};
List<String> list = new ArrayList<>();
arrayToList(strArr,list);//报错
}
}
package com.genericity;
import java.util.ArrayList;
import java.util.List;
public class MethodTest {
private static <T> void arrayToList(T[] objs, List<T> list){
for (T obj : objs) {
list.add(obj);
}
}
public static void main(String[] args) {
String [] strArr = {"aaa","bbb","ccc"};
List<String> list = new ArrayList<>();
arrayToList(strArr,list);
System.out.println(list);
}
}
package com.genericity;
import java.util.ArrayList;
import java.util.List;
public class MethodTest {
private static <T> void test(List<T> list1,List<T> list2){
System.out.println(list1);
System.out.println(list2);
}
public static void main(String[] args) {
List<Object> list1 = new ArrayList<>();
list1.add(1);
list1.add(1);
list1.add(1);
list1.add(1);
List<String> list2 = new ArrayList<>();
list2.add("jljj");
list2.add("jljj");
list2.add("jljj");
list2.add("jljj");
list2.add("jljj");
test(list1,list2);//类型不一样一个int一个String最后出现错误
}
}
还可以两个类型解决问题
package com.genericity;
public class GenterTest {
private static class Foo{
public <T> Foo(T t){
System.out.println(t);
}
}
public static void main(String[] args) {
new Foo("dddd");//String类型数据
new Foo(233);//Integer类型
new <String> Foo("ads");//显示了传入的类型
new <String> Foo(2323);//类型不匹配报错
}
}
package com.genericity;
public class InferTest {
public static class A<T>{
public static <E> A<E> test1(){
System.out.println("test1");
return new A<>();
}
public static <E> A<E> test2(E e,A<E> a){
System.out.println("test2");
return new A<>();
}
public T head(){
System.out.println("test3");
return null;
}
}
public static void main(String[] args) {
//下面两行代码相同
A<String> a1 = A.test1();//自动识别
A<String> a2 = A.<String>test1();
//下面两行相同
A.test2(56,A.test1());
A.test2(56,A.<Integer>test1());
}
}
//下面代码自动类型推断A.test1().head();两次推断最后就不能推断
String a = A.<String>test1().head();
package com.genericity;
public class ErasureTest {
private static class A<T extends Number>{
private T size;
public T getSize() {
return size;
}
public A(T size) {
this.size = size;
}
}
public static void main(String[] args) {
A<Integer> a = new A<>(50);
int size = a.getSize();
System.out.println(size);
A a1 = a;
int size1 = a1.getSize();
System.out.println(size1);
}
}