質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

解決済

ジェネリクスを持つクラスを継承したクラスに再度ジェネリクスを持たせた際にワイルドカード"?"が想定通りに機能しない

water_coffee
water_coffee

総合スコア7

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

2回答

0リアクション

3クリップ

4693閲覧

投稿2019/12/01 10:25

編集2020/10/06 10:47

まずジェネリクス<T>を持つスーパークラスAを作成します。

A.java:Java

public class A<T>{ }

次に、クラスAを継承して再度ジェネリクス<T>を持たせたサブクラスBを作成します。

B.java:Java

public class B<T> extends A<T>{ }

このクラスBのClassオブジェクトB.classをワイルドカードClass<? extends A<?>>を引数にしたメソッドにB.classを渡すとなぜかコンパイルエラーが発生します。

main.java:Java

public class main{ public void test(Class<? extends A<?>> c) { } public void main() { //コンパイルエラー test(B.class); } }

(追記)コンパイルエラーの内容は以下です。

Java

The method test(Class<? extends A<?>>) in the type main is not applicable for the arguments (Class<B>)Java(67108979)

なぜこういう挙動になるのかがいまいち理解できません。
どなたか教えていただけないでしょうか?
Bクラスにジェネリクスがついていようがいまいが、BクラスはA<T>クラスのサブクラスだと思うのですが…。

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jimbe

2019/12/01 14:20

> B.classを渡すとなぜかコンパイルエラーが発生します そのコンパイルエラーの内容もご提示頂いたほうが良いように思います.
xebme

2019/12/01 22:15

Bの型 <T>はAからBに継承されると考えますか?Bの型 <T>がAの<T>に適用されると考えますか?
water_coffee

2019/12/01 23:39

>jimbeさん ご指摘ありがとうございます。エラー内容追記しました。 >xebmeさん 後者の認識です。
xebme

2019/12/03 04:09

後者の認識が回答だと思います。test(Class<? super B<?>> c)。理由を明確に説明できれば回答します。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Generics

Genericsはパラメトリックなポリモーフィズムの形態であり、.NET やJavaなど、様々な言語に実装されています。C++のテンプレートと同等の機能を持ち合わせています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。