No.5ベストアンサー
- 回答日時:
例えば「食べられる物」を表す「Eatableインターフェイス」と「液体」を表す「Liquidインターフェイス」があったとして
・Checken implements Eatable
・Gasoline implements Liquid
・Beer implements Eatable, Liquid
というクラスがあった場合、
「食べ物」としてオブジェクトを扱いたい場合は
CheckenやBeerをEatableオブジェクトとして扱い、
「液体」として処理を行う場合には
GasolineやBeerをLiquidオブジェクトとして扱います。
上記のように2つ以上の抽象的なもの(=インターフェイス)として扱いたいクラスがあれば継承関係にないインターフェイス同士でキャストを利用する場面があるかもしれません。
ただ、
Liquid beerLiquid = (Liquid)beerEatable;
のような明示的なキャストは必要なく、
暗黙的なキャストが行われるだけだと思います。
具体的には最近流行のフレームワークなどでは
SerializableインターフェイスやCloneableインターフェイスとして内部処理を行うものもあるようです。
この2つのインターフェイスはもちろん継承関係にはありません。
No.4
- 回答日時:
以下のソースを実行したら、実行できました。
(貼り付けのために全角スペースに置換してあります)
クラスFooはインタフェースAaaとBbbをインプリメンツしていますが、AaaとBbbには継承関係はありません。
それでも、変数a を (Bbb) でキャストできるところが面白いですね。
public class Foo implements Aaa, Bbb{
public static void main(String[] args) {
Aaa a = new Foo();
a.aaa();
Bbb b = (Bbb)a;
b.bbb();
}
public void aaa() {
System.out.println("aaa");
}
public void bbb() {
System.out.println("bbb");
}
}
interface Aaa{
void aaa();
}
interface Bbb{
void bbb();
}
No.3
- 回答日時:
他の回答者さんの補足として、
1の回答の単純なソースを書きます。
みにくいと思いますが参考にしてください。
public class ClassA implements A {
public void aaa() {
System.out.println("aaa");
}
public void bbb() {
System.out.println("bbb");
}
public static void main(String[] args) {
A a = new ClassA();
a.aaa();
B b = (B)a; // A から B へキャスト
b.bbb();
}
}
interface A extends B {
public void aaa();
}
interface B {
public void bbb();
}
インタフェースもクラスと同様にextendsして親子関係を作れるので、キャストというか例えばBを引数とするメソッドにAのインスタンスを渡すことが可能です。
明示的にキャストする場面はちょっと思い浮かびませんけども。
ご解答、誠にありがとうございます。
hiraku-jp様のお礼文でも少し触れましたが、親子関係の無い場合でも
インターフェイスのキャストがコンパイル可能なのでしょうか?
public class ClassA implements A {
public void aaa() {
System.out.println("aaa");
}
public static void main(String[] args) {
A a = new ClassA();
a.aaa();
B b = (B)a; // A から B へキャスト
b.bbb();
}
}
interface A {
public void aaa();
}
interface B {
//Aとの継承関係をはずしました
public void bbb();
}
おそらく私が読んでいる参考書の記述が意図しているところは
上記のような状況だと思うのですが
この場合、コンパイルは可能だが実行時エラーになる、のでしょうか?
No.2
- 回答日時:
Javaにおける、基本型の変数のキャストと参照型の変数のキャストの違いは理解されていますか?
基本型のキャストが文字通り型を変換するのに対して、参照型のキャストはあくまでインスタンスを指し示す参照変数の型を変換するものであり、指し示すインスタンスがキャストされるわけではありません。
そして、インターフェース型の参照変数が指し示すインスタンスは、必ずそのインターフェースを実装したクラスのインスタンスになります。インスタンスが、自身か継承関係にあるスーパークラスの型の参照変数からしか参照できないのと同じように、自身が実装したインターフェースか、そのインターフェースと継承関係にあるスパーインターフェースの型の参照変数からしか参照できません。
インターフェースの場合はクラスの継承と違い、複数実装できますけどね。これらの関係にあるインターフェース型の参照変数なら、どれでも対象のインスタンスを参照できるので、インターフェース型の参照変数のキャストが成り立つわけですね。
1への回答はこんな感じです。
2への回答は、当然ポリモーフィックな処理を意図してだと思いますよ。
個人的にはJavaのインターフェースは多重継承の問題に対する非常にスマートな解決策だと思ってます。
・・・これで3への回答も兼ねてしまいましたね。。
ご解答誠にありがとうございました。
参考書に
インターフェイス→無関係なインターフェイス
への参照変数のキャストが可能とあったので混乱していました。
インターフェイス自体の参照変数というのはありえませんよね。
その文章の意図は
インターフェイスを実装したクラスの参照変数を無関係なインターフェイスにキャストする、
ということだったの、かな、と思いました。
No.1
- 回答日時:
質問の趣旨と、ずれているかもしれませんが、
お答えします。
JAVAは、OSに依存しない言語で、オブジェクト指向
かつ、HTML作成には、欠かせない言語です。JAVA
ベースで作られるツール・言語もあります。
JAVAベースのツール・言語の一例:
Super-Vidual-Formade for JAVA(PDF作成ツール)
Cold Fusion MX(DBアクセスも可能なHTML言語)
そして、これらのツールで扱うデータは、文字列
数字(実数・整数)等様々です。
したがって、これらのツールから、JAVAへアクセス
する際、型を変換(キャスト)する必要があるの
です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Chrome(クローム) クロームキャストでPC画面を映す際の手順について 1 2023/02/15 13:55
- C言語・C++・C# C言語について。 5 2023/06/27 18:37
- 釣り ショアジギロッドとルアーの適正重量について 3 2022/10/20 00:01
- 実用・教育 スナックのママをしています。10年目です。キャストにコミュニケーションのアドバイスをしたいのですが、 2 2023/08/16 23:23
- その他(悩み相談・人生相談) 男性に質問です。 私はクラブのキャストです。 2年ぐらい指名を頂いてるお客さまが私が お休みの日に新 2 2022/11/18 17:40
- 居酒屋・バル・バー ガールズバーの話です。 一年くらい前から一人のキャストと同伴するようになりました。 しかし、お店の金 5 2023/03/17 06:52
- 弁護士・行政書士・司法書士・社会保険労務士 記述対策について 1 2022/09/19 20:51
- 俳優・女優 初恋ファーストラブの キョンキョン。 このキャストで同世代だとしたら。 多分 最強は小泉今日子!!… 2 2023/04/21 00:04
- その他(悩み相談・人生相談) 風俗で働いています。緊急 お店の爆サイのスレがたちました。 自分でそれで病んじゃって自分のアンチこめ 3 2023/03/02 01:37
- その他(法律) 風俗で働いています。 お店の爆サイのスレがたちました。 自分でそれで病んじゃって自分のアンチこめ「で 2 2023/03/02 01:32
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
C#において、同じインスタンス...
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
C# インスタンスの破棄
-
VB.NET getとsetの概念がわかり...
-
javaのクラスの作り方、エラー...
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
文字列を日付に変換でParseExce...
-
ASPX(C#)で別ファイルで自分で...
-
String a = "a"; と String b =...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
SetWindowsHookExで質問
-
C#の構造体の開放のしかた
-
生成したインスタンスを削除す...
-
擬似コード
-
インスタンスのハンドル
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
SQLを連続発行する時の正しい(?...
-
C# インスタンスの破棄
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
-
newしないインスタンス?実体化...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
文字列を日付に変換でParseExce...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
C#の構造体の開放のしかた
-
マルチスレッド間でデータ交換...
-
vb.netでFAXを送信する方法
おすすめ情報