java中的类型推断是一个编译器过程,它自动从上下文信息中推断出未指定的数据类型参数。考虑一个例子,我们想要创建一个泛型类的对象。因此,为了创建这个对象,我们需要使用指定类型的参数调用泛型类的构造,例如 String、Float、Integer 等,这会增加代码长度。为了减少这种编码,java提供了灵活性,只要编译器从上下文中判断或猜测参数的类型,就可以学习空的类型参数。除此之外java还提供了通配符,允许用户实现类型参数的继承。 Java 8 提供了类型推断的改进版本。如果是类型,则不使用推理,然后编译器会生成未经检查的转换警告。
开始您的免费软件开发课程
网络开发、编程语言、软件测试及其他
语法如下:
Generic_class < type_parameter > obj = new Generic_class<> ( ); Where - Generic_class – Generic_class is an user create generic class. <type_parameter> - type_parameter is a type parameter, which represented by agular brakets(<>), that can have one or more type of parameter separated by commas. Obj – obj is the object of the generic class. < > − < > (diamond) represents the type inference.
接下来,我们编写 java 代码来更清楚地理解这一点,在下面的示例中,我们使用泛型类构造函数创建一个泛型类来接受值对,并为不同的数据对创建泛型类的对象类型,然后对类型参数使用类型推断,如下所示 –
代码:
package p1; class Pair <x, y> { private x first; private y second; public Pair(x a, y b) { first=a; second=b; } public x getFirst() { return first; } public y getSecond() { return second; } } public class Demo { public static void main( String[] arg) { // unchecked conversion warning Pair <Integer, String> ob1 = new Pair<Integer, String>(25, "Test1"); System.out.println("Integer value is : "+ob1.getFirst()); System.out.println("String valueis : "+ob1.getSecond()); System.out.println( ); // unchecked conversion warning Pair <String, Integer> ob2 = new Pair<String, Integer>("Test2", 30); System.out.println("String valueis : "+ob2.getFirst()); System.out.println("Integer is : "+ob2.getSecond()); System.out.println( ); // type inference, < > left it blank, compiler will infer type Pair <String, Integer> ob3 = new Pair<String, Integer>("Test3", 30); System.out.println("Integer valueis : "+ob3.getFirst()); System.out.println("Integer value is : "+ob3.getSecond()); System.out.println( ); // type inference, < > left it blank, compiler will infer type Pair <Integer, Integer> ob4 = new Pair< >(35, 40); System.out.println("Integer value is : "+ob4.getFirst()); System.out.println("Integer value is : "+ob4.getSecond()); System.out.println( ); } }
输出:
说明: 如上面的代码所示,泛型类 Pair 可以在类中包含两种不同的数据类型,即 x 和 y。这里,前两个对象是通过在两侧显式提及整数和/或字符串类型创建的,它们是 Java 的早期版本。在最后两个对象创建示例中,类型在一侧提及(我们可以将第二侧留空),这是在Java 7中引入的。稍后介绍在不显式提及类型的情况下调用指定方法java 8 中的参数,我们将在下一个示例中看到。
接下来,我们编写java代码来理解新的类型推断,其中我们使用泛型类的setter方法创建一个泛型类来接受不同类型的消息,并为不同的消息创建泛型类的对象不同的数据类型,然后对类型参数进行类型推断,如下:
代码:
package demo; class myGeneric < x > { private x msg; public x getMsg() { return msg; } public void setMsg(x msg) { this.msg = msg; } public String genInf1(myGeneric <String> m){ m.setMsg( "This is a Hello Message." ); return m.msg; } public Integer genInf2(myGeneric <Integer> m){ m.setMsg( 100 );; return m.msg; } } public class Demo { public static void main(String[] args) { // Before java 7 an old approach to create generic class object myGeneric <String> msg1 = new myGeneric <String>(); msg1.setMsg( "This is a first Message."); System.out.println(msg1.getMsg()); // type inference myGeneric <Integer> msg2 = new myGeneric <>(); msg2.setMsg(20); System.out.println(msg2.getMsg()); // New type inference System.out.println(msg1.genInf1( new myGeneric<>() )); System.out.println(msg1.genInf2( new myGeneric<>() )); System.out.println(msg2.genInf1( new myGeneric<>() )); System.out.println(msg2.genInf2( new myGeneric<>() )); } }
输出:
说明: 如上面的代码所示,调用特定的(genInf1() 和 genInf2()) 方法而不明确提及参数类型,这是 java 8 中引入的新类型推断的示例。
接下来,我们编写代码来理解新类型推断,其中我们使用 List 泛型类创建消息列表,并为不同数据类型的不同消息创建列表泛型类的对象,然后使用类型参数的类型推断和新类型推断,如下:
代码:
package demo; import java.util.ArrayList; import java.util.List; public class Demo { public static void main( String[] arg) { // Before Java 7 to create a list List <String> msg1 = new ArrayList <String>(); msg1.add("This is a first Message."); getMsg(msg1); // Java 7 type inference List<String> msg2 = new ArrayList<>(); msg2.add("This is a second Message."); getMsg(msg2); // as list is generic class so add integer List<Integer> msg3 = new ArrayList<>(); msg3.add(100); getMsg1(msg3); // Java 8 Compiler type infers type of ArrayList getMsg(new ArrayList<>()); } public static void getMsg(List <String> m){ if(!m.isEmpty()){ m.forEach(System.out::println); }else System.out.println("No Message."); } public static void getMsg1(List <Integer> m){ if(!m.isEmpty()){ m.forEach(System.out::println); }else System.out.println("No Message."); } }
输出:
类型推断用于创建泛型类类型的对象,如果我们希望编译器自动从上下文传递中推断出未指定的数据类型参数。
以上是Java 类型推断的详细内容。更多信息请关注PHP中文网其他相关文章!