2017-08-04 4 views
1

このコードを理解するのを助けてください。なぜ反変がコンパイルされるのですか? 私は正確にtest_conのようなタイプを記述する場合にのみ、それは動作します[子供](新しい子供)スカラの形容詞は

class GrandFather {} 
class Father extends GrandFather{} 
class Child extends Father{} 

def test_cov[T <: Father](man: T) = {} 
def test_con[T >: Father](man: T) = {} 


test_cov(new GrandFather) // failed, and it's right 
test_con(new GrandFather) 

test_cov(new Child) 
test_con(new Child) // don't failed. Why? 

答えて

3

技術的シンボル<:>:は、共変性と反変性を示すものではありません。それぞれ上端および下限とそれぞれ呼ばれます。

test_con(new Child)がコンパイル理由として

:クラスChildFatherを拡張するため、

それはは、すべての権利によってFatherであることを意味しています。また、すべてのタイプTは、スーパータイプとサブタイプの両方であるとみなされます。そのため、Fatherインスタンスをのスーパータイプを要求している def test_con[T >: Father](man: T) = {}メソッドに渡すと、正常にコンパイルされます。要するに

:「ChildFatherで、FatherFatherのスーパータイプである」

関連する問題