前言:
- 纸上得来终觉浅,绝知此事要躬行。
- 网上的此类文章可能相似的很多,但我相信这些更多的是学习者学习的痕迹。对作者本身有着特殊的含义。
- 当然感谢祖国的强大、社会服务工作者、以及千千万万的平凡无私人、也感谢尚学堂的老师们!谢谢你们这么优秀的课程。
| 泛型标记 | 对应单词 | 说明 |
|---|---|---|
| E | Element | 在容器中使用,表示容器中的元素 |
| T | Type | 表示普通的JAVA类 |
| K | Key | 表示键,例如:Map中的键Key |
| V | Value | 表示值 |
| N | Number | 表示数值类型 |
| ? | 表示不确定的JAVA类型 |
public class 类名<泛型表示符号> {
//类主体
}
/**
* @author 缘友一世
* date 2022/11/14-19:07
*/
public class Generic01<T> {
private T flag;
public void setFlag(T flag) {
this.flag=flag;
}
public T getFlag() {
return this.flag;
}
public static void main(String[] args) {
Generic01<String> generic = new Generic01<>();
generic.setFlag("hello");
System.out.println(generic.getFlag());
Generic01<Integer> generic01 = new Generic01<>();
generic01.setFlag(100);
System.out.println(generic01.getFlag());
}
}

public interface 接口名<泛型表示符号> {
//接口主体
}
/**
* @author 缘友一世
* date 2022/11/14-22:29
*/
interface IGeneric<T> {
T getName(T name);
}
class IGenericImpl implements IGeneric<String> {
@Override
public String getName(String name) {
return name;
}
}
public class Generic02 {
public static void main(String[] args) {
System.out.println(new IGenericImpl().getName("小明"));
IGeneric<String> iGeneric= new IGenericImpl();
System.out.println(iGeneric.getName("小美"));
}
}

public <泛型表示符号> void getName(泛型表示符号 name) {
}
public <泛型表示符号> 泛型表示符号 getName(泛型表示符号 name) {
}
/**
* @author 缘友一世
* date 2022/11/14-23:28
*/
class MethodGeneric {
public <T> void setName(T name) {
System.out.println(name);
}
public <T> T getName(T name) {
return name;
}
}
public class Generic03 {
public static void main(String[] args) {
new MethodGeneric().setName("小华");
new MethodGeneric().setName(666);
System.out.println(new MethodGeneric().getName("love you"));
System.out.println(new MethodGeneric().getName(521));
}
}

public static <泛型表示符号> void getName(泛型表示符号 name) {
}
public static <泛型表示符号> 泛型表示符号 getName(泛型表示符号 name) {
}
/**
* @author 缘友一世
* date 2022/11/14-23:36
*/
//静态方法
class StaticMethodGeneric {
public static <T> void setFlag(T flag) {
System.out.println(flag);
}
public static <T> T getFlag(T flag) {
return flag;
}
}
public class Generic04 {
public static void main(String[] args) {
StaticMethodGeneric.setFlag("i love sky");
StaticMethodGeneric.setFlag(2022);
System.out.println(StaticMethodGeneric.getFlag("he like her"));
System.out.println(StaticMethodGeneric.getFlag(6688));
}
}

public static <泛型表示符号> void showMsg(泛型表示符号... args) {
}
/**
* @author 缘友一世
* date 2022/11/14-23:44
*/
class ChangeGeneric {
public <T> void method(T...args) {
for(T t:args) {
System.out.print(t+" ");
}
}
}
public class Generic05 {
public static void main(String[] args) {
String[] strings = {"aaa", "bbb", "ccc"};
Integer[] integers = {1, 2, 3};
new ChangeGeneric().method(strings);
new ChangeGeneric().method(integers);
}
}

public void showFlag(Generic<?> generic) {
}
/**
* @author 缘友一世
* date 2022/11/14-23:52
*/
class MyGeneric<T> {
private T flag;
public void setFlag(T flag) {
this.flag=flag;
}
public T getFlag() {
return this.flag;
}
}
class showMsg {
public void showFlag(MyGeneric<?> generic) {
System.out.println(generic.getFlag());
}
}
public class Generic06 {
public static void main(String[] args) {
showMsg showMsg = new showMsg();
MyGeneric<Integer> generic = new MyGeneric<>();
generic.setFlag(20);
showMsg.showFlag(generic);
MyGeneric<Number> generic1 = new MyGeneric<>();
generic1.setFlag(33);
showMsg.showFlag(generic1);
MyGeneric<String> generic2 = new MyGeneric<>();
generic2.setFlag("boy");
showMsg.showFlag(generic2);
}
}

public void showFlag(Generic<? extends Number> generic) {
}
/**
* @author 缘友一世
* date 2022/11/15-18:00
*/
class MyGeneric07<T> {
private T flag;
public void setFlag(T flag) {
this.flag=flag;
}
public T getFlag() {
return this.flag;
}
}
class showMyMsg {
public void showFlag(MyGeneric07<? extends Number> myGeneric07) {
System.out.println(myGeneric07.getFlag());
}
}
public class Generic07 {
public static void main(String[] args) {
showMyMsg showMyMsg = new showMyMsg();
MyGeneric07<Integer> generic07 = new MyGeneric07<>();
generic07.setFlag(20);
showMyMsg.showFlag(generic07);
MyGeneric07<Number> generic071 = new MyGeneric07<>();
generic071.setFlag(666.666);
showMyMsg.showFlag(generic071);
}
}

public void showFlag(Generic<? super Number> generic) {
}
class MyGeneric08<T> {
private T flag;
public T getFlag() {
return this.flag;
}
public void setFlag(T flag) {
this.flag = flag;
}
}
class showMsg08 {
public void showFlag(MyGeneric08<? super Integer> myGeneric) {
System.out.println(myGeneric.getFlag());
}
}
public class Generic08 {
public static void main(String[] args) {
showMsg08 showMsg = new showMsg08();
MyGeneric08<Integer> myGeneric = new MyGeneric08<>();
myGeneric.setFlag(66);
showMsg.showFlag(myGeneric);
MyGeneric08<Object> myGeneric1 = new MyGeneric08<>();
myGeneric1.setFlag(50.5);
showMsg.showFlag(myGeneric1);
}
}

Test t; 这样写法是错误,我们可以使用对应的包装类:Testt;T elm=newT();运行时类型参数T会被替换成Object,无法创建T类型的对象,容易引起误解,所以在Java中不支持这种写法。