public class PrinterVar { //该方法接收一个T类型的变量,打印并返回该变量 public T print(T var) { System.out.println(var); return var; } public static void main(String[] args) { PrinterVar printerVar = new PrinterVar(); String var = printerVar.print("aa");//String类型 Integer var1 = printerVar.print(12);//int类型 System.out.println(var + " " + var1); }
其实,当类是普通类时,我们仍然能够使用泛型方法。下面是一个例子:
当我们声明了一个泛型类后,可以很自然地在类内部使用泛型方法。
f(3) = 3*3+1 = 10
该过程就相当于向数学函数中代入数值:
MyArrayList myArrayList = new MyArrayList(4);
当我们需要实例化泛型类时,就使用具体的类型来替换类型变量(T):
public class MyClass { //......}
当然,一个泛型类可以有多个类型变量:
private T[] elementData;public void add(T o) { //.......}public T get(int index) {//......}
泛型类中的成员变量、方法参数和返回值的类型都使用类型变量代替:
类型变量的名称可以随便取,一般使用大写字母表示,比如E、K、V、T等。
f(x) = 3x + 1
如何理解类型变量?它就类似于数学中函数中的变量x,用来代替具体的值:
public class MyArrayList { //......}
泛型类的声明方式:引入一个类型变量,如T,然后使用将其括起来,放在类名后。
经过改造,我们把MyArrayList类改为了一个泛型类,它是一个具有多个类型变量的类。
public class Test { public static void main(String[] args) { //myArrayList 给int元素使用 MyArrayList myArrayList = new MyArrayList(4); myArrayList.add(111); //向数组中添加3个int元素// myArrayList.add("222"); //添加非Integer元素报错 int i = myArrayList.get(1); //无需强制转型 System.out.println(i); }}
测试:
public class MyArrayList { private T[] elementData; private int size = 0; public MyArrayList(int capacity) { elementData = (T[]) new Object[capacity]; } public void add(T o) { //向数组中添加元素 if (size == elementData.length) { throw new IndexOutOfBoundsException("数组已满"); } elementData[size++] = o; } public T get(int index) { //从数组中获取元素 if (index size - 1) { throw new IndexOutOfBoundsException("超出范围"); } return elementData[index]; } @Override public String toString() { return "MyArrayList{" + "elementData=" + Arrays.toString(elementData) + '}'; }}
使用泛型改造MyArrayList:
有!用泛型!
那这个问题有没有解决办法呢?
int i = (int)myArrayList.get(1); //本来是String类型的值,但我提前不知道,拿int变量接收,报错
这就导致了当我们从数组中获取某个元素时,很难知道它的确切类型,往往会强转类型失败。
myArrayList.add(111); //int类型myArrayList.add("222"); //String类型myArrayList.add(true); //布尔类型
第二:同一个数组可以添加各种类型的元素。
int i = (int) myArrayList.get(0);
第一:从数组中获取元素时,需要强制转换类型才行。
但是这样又出现了两个问题:
发现可以向数组中添加和获取int或String类型的元素,这证明该类的数组和方法同时对各种类型的数据都有用,不必再添加额外代码。
public class Test { public static void main(String[] args) { //myArrayList 给int元素使用 MyArrayList myArrayList = new MyArrayList(4); myArrayList.add(111); //向数组中添加3个int元素 myArrayList.add(222); myArrayList.add(333); int i = (int) myArrayList.get(0); //获取 System.out.println(i); //myArrayList 给String元素使用 MyArrayList myArrayList1 = new MyArrayList(4); myArrayList1.add("aaa"); myArrayList1.add("bbb"); myArrayList1.add("ccc"); String str = (String) myArrayList1.get(1); System.out.println(str); }}
再测试一下:
public class MyArrayList { private Object[] elementData; private int size = 0; public MyArrayList(int capacity) { elementData = new Object[capacity]; } public void add(Object o) { //向数组中添加元素 if (size == elementData.length) { throw new IndexOutOfBoundsException("数组已满"); } elementData[size++] = o; } public Object get(int index) { //从数组中获取元素 if (index size - 1) { throw new IndexOutOfBoundsException("超出范围"); } return elementData[index]; } @Override public String toString() { return "MyArrayList{" + "elementData=" + Arrays.toString(elementData) + '}'; }}
我们知道,Object类是所有类的父类,Object类型的变量能够引用任何类型的对象。所以可以将类型改为Object:
这样太麻烦了!有没有解决办法?有!
此时,就得需要再写一份代码,该份代码较之前的并无大修改,只是把int改为String。如果场景继续变怎么办?那就再写一份新代码!
很显然,继续使用该类会报错,报错的原因很简单:我们向数组中添加的元素是String类型的,而数组和方法参数类型是int类型。
但是如果我们的场景不再需要int类型的元素,而是需要String类型的,那怎么办?
向数组中添加3个int类型的元素并能获取,这没问题。
public class Test { public static void main(String[] args) { MyArrayList myArrayList = new MyArrayList(4); myArrayList.add(111); //向数组中添加3个int元素 myArrayList.add(222); myArrayList.add(333); int i = myArrayList.get(0); //获取 System.out.println(i);//以上正常运行 myArrayList.add("行小观"); //添加一个String元素,类型不匹配,报错 }}
下面测试一下:
该类很简单:有两个成员变量,elementData是一个数组,size是数组中元素的数量。add和get方法能添加和获取元素。
public class MyArrayList { private int[] elementData; private int size = 0; public MyArrayList(int capacity) { elementData = new int[capacity]; } //向数组中添加元素 public void add(int i) { if (size == elementData.length) { throw new IndexOutOfBoundsException("数组已满"); } elementData[size++] = i; } //从数组中根据下标获取元素 public int get(int index) { if (index size - 1) { throw new IndexOutOfBoundsException("超出范围"); } return elementData[index]; } @Override public String toString() { return "MyArrayList{" + "elementData=" + Arrays.toString(elementData) + '}'; }}
为了说明问题,本类写的尽量简陋,请把目光主要放在类型上。
看下面一个例子:
苹果iPhone 解锁新姿势!40秒破iPhone锁屏密码!
在这个科技飞速发展的时代,智能手机在我们的生活中扮演着越来越重要的角色。而iPhone作为智能手机市场的领导者之一,更是受到了广大用户的热烈追捧。但是,有时候我们可能会遇到一些烦恼,比如说锁屏密码忘记了、手机被盗等等。那么,今天就来给大家分享一些打破iPhone锁屏密码的方法,帮助广大iPhone用户解决烦恼。
首先,我们来说说40秒破iPhone锁屏密码的方法。这个方法需要你使用一个第三方锁屏软件,而这种软件是可以在短时间内破解密码的。但是,使用这种软件会有一定的风险,因为它可能会让你的手机感染病毒或者是窃取你的个人信息。所以,如果你不熟悉这种软件,建议先做好相关的了解和测试,再决定是否使用。
其次,我们来说说其他的解锁方法。比如说,可以使用苹果自己的密码解锁,这种方法需要你在设置中开启“密码”选项,然后就可以使用密码解锁你的iPhone了。另外,如果是iPhone 12系列,就可以使用face ID解锁,这种方法更加便捷,也更加安全。
综上所述,根据标题《苹果iPhone 解锁新姿势》写的一篇内容与40秒破iPhone锁屏密码有关的文章,可以为广大iPhone用户提供一些实用的解锁方法,帮助他们更加方便快捷地使用自己的手机,解决烦恼。