[解決済み] 一般的な戻り値の上限 -インターフェースとクラスの比較 - 意外と有効なコード
質問
これはサードパーティのライブラリAPIからの実際の例ですが、簡略化されています。
Oracle JDK 8u72 でコンパイルされています。
この2つの方法について考えてみましょう。
<X extends CharSequence> X getCharSequence() {
return (X) "hello";
}
<X extends String> X getString() {
return (X) "hello";
}
どちらも "unchecked cast" という警告が表示されます - 理由はわかりました。私が困惑しているのは、なぜ私が
Integer x = getCharSequence();
で、コンパイルは?コンパイラは
Integer
は実装されていません。
CharSequence
. への呼び出しは
Integer y = getString();
を実行すると、(予想通り)エラーが発生します。
<ブロッククオートincompatible types: inference variable X has incompatible upper bounds java.lang.Integer,java.lang.String
なぜこの動作が有効だと考えられるのか、誰か説明してください。どのように役に立つのでしょうか?
クライアントはこの呼び出しが安全でないことを知りません。クライアントのコードは警告なしにコンパイルされます。なぜコンパイルはそのことについて警告を出したり、エラーを出したりしないのでしょうか?
また、この例とどう違うのでしょうか。
<X extends CharSequence> void doCharSequence(List<X> l) {
}
List<CharSequence> chsL = new ArrayList<>();
doCharSequence(chsL); // compiles
List<Integer> intL = new ArrayList<>();
doCharSequence(intL); // error
パスしようとする
List<Integer>
は、予想通りエラーが発生します。
method doCharSequence in class generic.GenericTest cannot be applied to given types; required: java.util.List<X> found: java.util.List<java.lang.Integer> reason: inference variable X has incompatible bounds equality constraints: java.lang.Integer upper bounds: java.lang.CharSequence
それがエラーとして報告された場合、なぜ
Integer x = getCharSequence();
はないのですか?
解決方法は?
CharSequence
は
interface
. したがって、たとえ
SomeClass
は実装されていません。
CharSequence
を作成することは完全に可能です。
class SubClass extends SomeClass implements CharSequence
したがって、次のように書くことができます。
SomeClass c = getCharSequence();
というのは、推論された型が
X
は交差型
SomeClass & CharSequence
.
の場合、少し変です。
Integer
なぜなら
Integer
はfinalですが
final
は、これらのルールでは何の役割も果たしません。例えば、次のように書くことができます。
<T extends Integer & CharSequence>
一方
String
は
interface
を拡張することは不可能です。
SomeClass
のサブタイプを取得するために
String
なぜなら、javaはクラスの多重継承をサポートしていないからです。
を使用すると
List
の例では、ジェネリックスは共変でも共変量でもないことを覚えておく必要があります。つまり、もし
X
のサブタイプです。
Y
,
List<X>
のサブタイプでもスーパータイプでもありません。
List<Y>
. というのも
Integer
は実装されていません。
CharSequence
を使用することはできません。
List<Integer>
の中に
doCharSequence
メソッドを使用します。
しかし、これをコンパイルすることは可能です。
<T extends Integer & CharSequence> void foo(List<T> list) {
doCharSequence(list);
}
というメソッドがある場合
を返します。
a
List<T>
のようになります。
static <T extends CharSequence> List<T> foo()
できること
List<? extends Integer> list = foo();
ここでも、推論された型が
Integer & CharSequence
のサブタイプであり、これは
Integer
.
複数の境界を指定した場合、暗黙のうちに交差型が発生する(例.
<T extends SomeClass & CharSequence>
).
詳しくはこちら こちら は、JLSで型境界がどのように機能するかを説明している部分です。複数のインターフェイスを含めることができる、例えば
<T extends String & CharSequence & List & Comparator>
が、最初のバウンドだけが非インターフェイスである可能性があります。
関連
-
スタイルシートとして解釈されるリソースが、MIMEタイプtext/htmlで転送される。
-
javaの模造品QQ WeChatのチャットルーム
-
プロローグでのコンテンツは禁止されています
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
[解決済み] 汎用型Tのクラスインスタンスを取得する方法を教えてください。
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] GsonでList<T>オブジェクトをデシリアライズする?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
java Mail send email smtp is not authenticated by TLS encryption solution.
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
spring aop アドバイスからの Null 戻り値が、サマリーのプリミティブ戻り値と一致しない。
-
javaでよく使われる英単語
-
HttpClientがGZIP形式でない場合の対処法
-
このラインで複数のマーカーを解決する方法
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策