12.Javaの基本 - ワイルドカード
基本概念
ワイルドカード(Wildcard)とは、型パラメータを疑問符を用いて表現し、[未知の型]の[型制約]を表現する方法です。
ジェネリックはデータ型をパラメータとして定義し、使用時に特定の型を指定できます。ただし、使用時に特定の型を判断できない場合は、ワイルドカードを使用して解決する必要があります。
抽象的に言えば、ジェネリック型は共分散をサポートしていないため、ジェネリック型を共分散にするためにワイルドカードが導入されます。
ワイルドカードの役割
2 つの例を通してワイルドカードの役割を探ってみましょう。
1. ワイルドカードを使用しないでください
ArrayList<Object> list_obj = null; ArrayList<String> list_str = new ArrayList<String>(); // ArrayList 的元素支持 String -> Object 的强制转换list_str.add("hello"); System.out.println((Object)list_str.get(0));// 编译错误,泛型不支持协变list_obj = list_str;
コードを観察すると、次のことがわかります。
String は Object のサブクラスであるため、ArrayList に格納されている要素は String -> Object への上方変換をサポートしています。
ジェネリックは共分散をサポートしていないため、ArrayList のパラメーターの型を String -> Object に変換するとコンパイル エラーが発生しました。
2. ワイルドカードを使用します
ArrayList<String> list_str = new ArrayList<String>(); list_str.add("hello"); ArrayList<Integer> list_int = new ArrayList<Integer>(); list_int.add(100); ArrayList<?> list = null; list = list_str; System.out.println(list.get(0)); // hellolist = list_int; System.out.println(list.get(0)); // 100//编译错误list.add("hello"); list.add(100);
コードを観察して次の点を見つけます:
ワイルドカードを使用すると、ジェネリックが共分散をサポートしないという制限が解決され、あらゆるタイプの変換を受け入れることができます。
しかし同時に、あらゆるタイプのオブジェクトを追加する権利も失います。
ワイルドカードの種類
ワイルドカードには 3 つの形式があります。つまり、
//1、无限定通配符 Demo<?>//2、上边界限定通配符 Demo< ? extends Number> //3、下边界限定通配符 Demo< ? super Number>
1 上限ワイルドカード
次の例を確認してください。継承関係を持つ 3 つのクラスが定義されています。 > 労働者。
class Person{ void print(){ } } class Man extends Person{ void paly(){ } } class Worker extends Man{ void say(){ } }public class Test { public static void main(String[] args) { // 创建了三个 ArrayList 数组 ArrayList<Person> personList = new ArrayList<Person>(); ArrayList<Man> manList= new ArrayList<Man>(); ArrayList<Worker> workerList = new ArrayList<Worker>(); // 限定了上界, ? 代表 Man 以及继承 Man 的类 ArrayList<? extends Man> list = null; list = manList; list = workerList; // 编译错误,因为 Person 是 Man 的父类 list = personList; // 编译错误,因为使用了通配符就不能添加对象 list.add(new Man()); list.add(new Worker()); for(Man man : list){ man.print(); man.paly(); } for(Person per : list){ per.print(); } // 编译错误,因为 ? 也可以代表 Man // 从继承我们可以知道 Worker 肯定是 Man,但 Man 不一定是 Worker。 // for(Worker worker : list); } }
2. 下限ワイルドカード
// 省略相同代码...public class Test { public static void main(String[] args) { ArrayList<Person> personList = new ArrayList<Person>(); ArrayList<Man> manList= new ArrayList<Man>(); ArrayList<Worker> workList = new ArrayList<Worker>(); // 限定了下届, ? 代表 Man 以及 Man 的父类 ArrayList<? super Man> list = null; list = personList; list = manList; // 编译错误,因为 Worker 是 Man 的子类 list = workList; // 编译错误,无法确定其父类对象 // Person 继承子 Cell 类,那么用 Person 遍历就是错误的 // for(Man man : list); // for(Person per : list); // 因为 Object 是所有类的根类,所以可以用Object来遍历 // for(Object obj : list); } }
3. 無制限ワイルドカード
// 省略相同代码...public class Test { public static void main(String[] args) { ArrayList<Person> personList = new ArrayList<Person>(); ArrayList<Man> manList= new ArrayList<Man>(); ArrayList<Worker> workList = new ArrayList<Worker>(); //无边界通配符 ArrayList<?> list = null; //可以代表一切类型 list = personList; list = manList; list = workList; //为了避免类型混淆,只允许使用 Object 遍历 for(Object obj : list); } }
上記は、12. Java の基礎 - ワイルドカードの内容です。詳細については、PHP 中国語 Web サイトを参照してください。 (www.php .cn)!

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4
