Let’s start with a simple example:
1
<code>
public
void testGenerics() {<br> Collection<Number> numbers =
new
ArrayList<>();<br> numbers.add(1);
Copy after login
This example is actually a bit anti-human. It is estimated that the first reaction of most people (including me) to this conversion must be "of course it is right" (this is I fell into a trap), let me tell you my understanding:
Collection: Indicates that this Collection contains all Number type objects, which can be Integer/Long/Float, because The compiler can determine that obj instanceof Number == true;
Collection: Indicates that this Collection is a Collection instance of "a subtype" of the Number type, which can be Collection< Integer>/Collection, so calling numbers2.add(1) will not work, because the compiler does not know which subtype of Number the element contained in numbers2 is, and the compiler cannot determine the result of obj instanceof UnknownType;
Collection, this E type is "a" specific type, and cannot be a placeholder representing multiple subtypes of a parent;
Another example:
1
<code>
public
void testGenerics() {<br> Collection<Number> numbers =
new
ArrayList<>();<br> Collection<Integer> integers =
new
ArrayList<>();<br> Collection<?
extends
Number> numbers2 =
new
ArrayList<>();<br> <br> numbers2 = integers;
Copy after login
Integer obviously inherits Number, so why
is not established, let’s look at an example:
1
<code>
public
void testGenerics() {<br> Collection<Integer> profits =
new
ArrayList<>();<br> <br> insertSomething(profits);
Copy after login
If line 1 is established, then the next profit will be a negative number, and a series of subsequent calculations will sound abnormal. If the code If it is not robust enough, it may even throw some unexpected RuntimeException, causing the method to end abnormally or even the program to crash.
So in one sentence, Collection != Collection is for runtime safety, and possible type conversion exceptions will be resolved at compile time.
Now let’s talk about Collection and Collection. The first reaction of many people (including me) must be “Object is the common parent class of all java objects, so Collection< "Object> can represent any type of collection ", let's look at an example:
1
<code>
public
void testGenerics2() {<br> Collection<Integer> integers =
new
ArrayList<>();<br><br> Collection<?> objects2 = integers;
Copy after login
##Collection represents a larger range than Collection;
Objects2.add(1) cannot be called because the compiler cannot accurately infer which data type container objects2 is, and a runtime type conversion exception may occur;
The correct way to write a collection of any data type is Collection;
##Collection cannot represent a collection of any type.
##Why Collection does not represent a collection of any type? In fact, the compiler thinks there is a risk of type conversion errors:
1
<code>
public
void testGenerics() {<br> Collection<Integer> integers =
new
ArrayList<>();<br><br> Collection<Object> objects = integers;
Copy after login
Collection can add data to the container, because Object is the parent class of all objects and is a known type, which can be judged by obj instanceof Object;
Collection< ;?>Cannot put data into the container because? (UnknownType) is an unknown type and the result of obj instanceof UnknownType cannot be judged;
##? It represents an unknown type, and Object represents a known type;
If Collection represents any type, according to Murphy's Law (what may happen will definitely happen ), then the crash in the above example is bound to happen. . (Another online glitch)
The above is the detailed content of How to use java generic container Collection. For more information, please follow other related articles on the PHP Chinese website!
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Square Root in Java
Aug 30, 2024 pm 04:26 PM
Guide to Square Root in Java. Here we discuss how Square Root works in Java with example and its code implementation respectively.
Perfect Number in Java
Aug 30, 2024 pm 04:28 PM
Guide to Perfect Number in Java. Here we discuss the Definition, How to check Perfect number in Java?, examples with code implementation.
Random Number Generator in Java
Aug 30, 2024 pm 04:27 PM
Guide to Random Number Generator in Java. Here we discuss Functions in Java with examples and two different Generators with ther examples.
Weka in Java
Aug 30, 2024 pm 04:28 PM
Guide to Weka in Java. Here we discuss the Introduction, how to use weka java, the type of platform, and advantages with examples.
Smith Number in Java
Aug 30, 2024 pm 04:28 PM
Guide to Smith Number in Java. Here we discuss the Definition, How to check smith number in Java? example with code implementation.
Java Spring Interview Questions
Aug 30, 2024 pm 04:29 PM
In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.
Break or return from Java 8 stream forEach?
Feb 07, 2025 pm 12:09 PM
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
TimeStamp to Date in Java
Aug 30, 2024 pm 04:28 PM
Guide to TimeStamp to Date in Java. Here we also discuss the introduction and how to convert timestamp to date in java along with examples.
See all articles