What are the differences between placeholders T and ? in java generics?
First two pieces of code:
public static <T> void show1(List<T> list){ for (Object object : list) { System.out.println(object.toString()); } } public static void show2(List<?> list) { for (Object object : list) { System.out.println(object); } }
You can see that we use T in the show1 method. Everyone knows that this is a common way of writing generics, so T here refers to a certain type of specific Objects and list collections can only store data of the same type. If different types of data are inserted, an error will be reported.
So what do we use in the show2 method? , you can see that there is no <T>
in front of void,? It can be expressed as a placeholder, and it does not know how many types of data will be stored in the list collection, so this shows that it is also possible to store N data types in our list.
Let’s intuitively feel the difference between the two through a piece of test code:
public static void test(){ List<Student> list1 = new ArrayList<>(); list1.add(new Student("zhangsan",18,0)); list1.add(new Student("lisi",28,0)); list1.add(new Student("wangwu",24,1)); //这里如果add(new Teacher(...));就会报错,因为我们已经给List指定了数据类型为Student show1(list1); System.out.println("************分割线**************"); //这里我们并没有给List指定具体的数据类型,可以存放多种类型数据 List list2 = new ArrayList<>(); list2.add(new Student("zhaoliu",22,1)); list2.add(new Teacher("sunba",30,0)); show2(list2); }
Let’s take a look at the running results:
Student{name='zhangsan ', age=18, sex=0}
Student{name='lisi', age=28, sex=0}
Student{name='wangwu', age=24, sex=1}
************Separation line******************
Student{name='zhaoliu', age=22, sex=1}
Teacher{name='sunba', age=30, sex=0}
You can see the difference from show1 from the show2 method. List2 stores two types of Student and Teacher. The same can be done Output data, so this is the difference between T and ?~ Friends, do you understand?
Let’s take a look? Extended writing method:
List<? extends data type> list
public static void show3(List<? extends Teacher> list) { for (Object object : list) { System.out.println(object); } }
List<? extends Teacher> list
This writing method means that it can Receive a list collection of Teacher and its subclass data types, and write a test method show3(list2);
Try:
Student{name='zhaoliu', age=22, sex=1} Teacher{name='sunba', age=30, sex=0}
You can see normal output, because the data in the collection are all It is a subclass type of Teacher. What will happen if we change List<? extends Teacher> list
to List<? extends Student> list
?
Look at this picture carefully. We have created a new list3 and declared the data type to be Teacher. At this time, we call show3(List<? extends Student> list)
An error will be reported immediately. The error message indicates that Teacher cannot be converted to Student, because Student is a subclass of Teacher, and we only accept Student and its subclasses, so of course an error will be reported.
List<? super data type> list
This way of writing means that only the specified data type and its parent class type are received, and it is also a simple way to write a piece of code Take a look at the effect:
public static void show4(List<? super Student> list) { for (Object object : list) { System.out.println(object); } }
It can be seen that what we receive is the collection of Student and its parent class. We write two collection data and then call it to try.
List list4 = new ArrayList<>(); list4.add(new Student("sunba",30,0)); list4.add(new Teacher("zhaoliu",22,1)); show4(list4);
Insert a Student and Teacher object into the list and see the result:
Student{name='sunba', age=30, sex=0} Teacher{name='zhaoliu', age=22, sex=1}
Nothing wrong, it runs normally and outputs.
Let’s take a look at what will happen if we pass a collection of Student subclasses
You can see the same as before, it will The error is reported for the same reason, thinking that we have defined a data type that can only receive Student and its parent class.
Finally let’s look at a situation
If I don’t specify a data type when defining List, and insert a Child, Student, Teacher, or call show4(List super Student> list)
, will an error be reported? If no error is reported, what will be the result?
You can see that no error is reported because list can store multiple data types. So what will be the result when calling the show4 method?
You can see that the program runs normally and outputs results. Note that what we receive is the Student and its parent class object data types, because our Child inherits from Student. Therefore, the program automatically converts our Child into the parent class Student for output, so everyone should pay attention to this, and it will automatically convert upward.
The above is the detailed content of What are the differences between placeholders T and ? in java generics?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

Guide to Square Root in Java. Here we discuss how Square Root works in Java with example and its code implementation respectively.

Guide to Perfect Number in Java. Here we discuss the Definition, How to check Perfect number in Java?, examples with code implementation.

Guide to Random Number Generator in Java. Here we discuss Functions in Java with examples and two different Generators with ther examples.

Guide to the Armstrong Number in Java. Here we discuss an introduction to Armstrong's number in java along with some of the code.

Guide to Weka in Java. Here we discuss the Introduction, how to use weka java, the type of platform, and advantages with examples.

Guide to Smith Number in Java. Here we discuss the Definition, How to check smith number in Java? example with code implementation.

In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.

Java 8 introduces the Stream API, providing a powerful and expressive way to process data collections. However, a common question when using Stream is: How to break or return from a forEach operation? Traditional loops allow for early interruption or return, but Stream's forEach method does not directly support this method. This article will explain the reasons and explore alternative methods for implementing premature termination in Stream processing systems. Further reading: Java Stream API improvements Understand Stream forEach The forEach method is a terminal operation that performs one operation on each element in the Stream. Its design intention is
