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

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

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

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

Q&A

解決済

1回答

217閲覧

Scalaの型の.typeについて

nanitozo

総合スコア5

Scala

ScalaはJava仮想マシンで動作を行うオブジェクト指向型プログラミング言語の1つです。静的型付けの関数型言語で、コンパイルエラーの検出に強みがあります。

0グッド

0クリップ

投稿2020/03/19 02:47

編集2020/03/19 03:33

Scalaの型の**.type**ってなんでしょうか。

Scalaで列挙型を使いたいときに
シールドクラスとケースオブジェクトを使うとします。
例えば以下のコードです

sealed abstract class Fluits(val value:String) case object Fluits { case object Apple extends Fluits("Apple") case object Banana extends Fluits("Fluits") }

このとき
Fluits.Appleの型は Fluits.Apple.typeになります
の.typeってなんでしょうか?

また、Fluits.Apple:Fluits の型はFluitsです
型のキャストができるのに、なぜデフォルトが**.typeになっているか疑問です。
以下は
console出力**です

scala> sealed abstract class Fluits(val value:String) defined class Fluits scala> case object Fluits { | case object Apple extends Fluits("Apple") | case object Banana extends Fluits("Fluits") | } defined object Fluits warning: previously defined class Fluits is not a companion to object Fluits. Companions must be defined together; you may wish to use :paste mode for this. scala> scala> Fluits.Apple res2: Fluits.Apple.type = Apple scala> Fluits.Apple:Fluits res3: Fluits = Apple

何卒よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2020/03/19 04:21

`Fluits.Apple`は「`Fluits`を継承した何かの型」のインスタンスであるはずで、それが`Fluits.Apple.type`だという事実がここにあるだけで、質問になっていないように思います。 事実に対して「疑問です」と書かれても、何か疑問なのか、何を疑問に思っているのかは伝わらないかと。
nanitozo

2020/03/19 05:14

分かりづらくてすみません 疑問は「.typeとは何ですか」です つまり、.type はインスタンスを意味するものの型 ということでしょうか。 何卒よろしくお願いします。
guest

回答1

0

ベストアンサー

Fluits.Appleを評価して返ってくるオブジェクトのFluits.Apple.typeである、という事実が明らかになっているだけのようにしか見えません。


コンパニオンオブジェクトの型について考えてみましょう。

scala

1class Example {} 2object Example { def foo=1 }

として、Exampleという型と、コンパニオンオブジェクトを定義したとしましょう。
そうすると

scala

1scala> Example.foo 2res1: Int = 1

というように使えます。

ここで、Exampleの型はExampleでしょうか?

そんなことはありえません。

Example.fooとすると1が返ってきますから、Exampleの型はfooというメソッド(かあるいはフィールド)を持っていないといけませんが、Example型はfooという名前のメソッド(もフィールド)を持っていません。

つまり

前提
Exampleはfooを持っていない
Exampleを評価して得られるオブジェクトはfooを持っている

結論
Exampleを評価して得られるオブジェクトのはExampleじゃない

実際

scala

1scala> Example 2res2: Example.type = Example$@924f3f1

Exampleを評価するとその型はExampleではなくてExample.typeです。


「式Exampleを評価した時の型」と「Example型」の区別が付けられるなら質問も特に不思議なことはないかと思います。

Fluits.Appleを評価した時のインスタンスの型はFluitsではありえません

Fluitsは抽象型ですからインスタンスが作れません。Fluitsを継承した具象型の「何か」でなければなりません。

であれば、Fluits.Appleを評価した時の式の型は、その具象型である方が自然です。
その具象型がFluits.Apple.typeであるというだけかと。

投稿2020/03/19 14:18

quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nanitozo

2020/03/22 15:40

とても丁寧にご教授頂き、ありがとうございます。 理解することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問