Scala类型方差示例

时间:2016-06-21 15:21:53

标签: scala

以下示例取自Scala编程,第2版。 我怀疑的是为什么有两个翻转,如下面的陈述中提到的那样#34;这个论点中的U型再次处于正位置(两个翻转)"?

meow方法结果参数位置为+。因此Cat [Cat [U,T],U]中的Cat [U,T]将具有 - 位置,因为在Cat类中,类型参数T被声明为-ve。

规则说在C [Arg]中,如果声明了C&C的类型参数,则会翻转Arg的分类 - 如C [-Q]

应用应该为的规则U将被翻转为+。所以只有翻转。如果从书中摘录的段落中提到的两个翻牌怎么来?

  abstract class Cat[-T, +U] {

    def meow[W−](volume: T−, listener: Cat[U+, T−]−)
    : Cat[Cat[U+, T−]−, U+]+

 }
  

类型参数W和两个值参数(音量和侦听器)的位置都是负数。查看喵喵的结果类型,第一个Cat [U,T]参数的位置是负数,因为Cat的第一个类型参数T用 - 来注释。此参数中的类型U再次处于正位置(两个翻转),而该参数内的类型T仍处于负位置。

1 个答案:

答案 0 :(得分:1)

UCat[U, T]处于否定位置,Cat[Cat[U,T],U]本身处于(-1)*(-1) == 1的负位置。两个否定点在这里给出了正面,就像A一样。应该很容易理解为什么:考虑两种类型BBAB <: A的子类型(简称Cat[B, T] >: Cat[A, T])。然后T适用于任何类型Cat[Cat[B, T], S] <: Cat[Cat[A, T], S](这只是反方位意味着什么)。然后是 function addtest() { var element = '<div class="alert alert-info fade in" id="addtestheader"><span class="glyphicon glyphicon-plus"></span>&nbsp;Add New Test</div><em>&nbsp;&nbsp;&nbsp;All fields are mandatory</em><form><div class="form-inline"><div id="formelements"><label>1. Name of Test :</label><input type="text" class="form-control" id="testname" style="height:30px;" placeholder="Maximum 20 Characters">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<label>2. Scheduled on :</label><div id="datetimepicker" class="input-append date"><input type="text" style="height:30px;" placeholder="Date & Time of Test"></input><span class="add-on" style="height:30px;"><i data-time-icon="icon-time" data-date-icon="icon-calendar"></i></span></div></div></div><div class="alert alert-info fade in" id="addtestheader" style="height:25px;font-size:15px;padding:2px;"><span class="glyphicon glyphicon-user"></span>&nbsp;Select Target students for test</div><div class="form-inline"><div id="formelements"><div class = "input-group"><span class = "input-group-addon" style="width:40px;">3. Programme</span><select id="programme" name="programme" class="form-control" style="width:150px;" onchange="changeinprog();"><option value="0" selected>Select One</option><option value="1">B.Tech</option><option value="2">M.Tech</option><option value="3">MCA</option><option value="4">M.Sc.</option></select><span class = "input-group-addon">4. Branch</span><select id="branch" name="branch" class="form-control" onchange="changeofbranch();"><option value="0">Select Programme</option></select></div><div class = "input-group" style="margin-top:10px;"><span class = "input-group-addon" style="width:40px;">5. Semester</span><select id="semester" name="semester" class="form-control" style="width:150px;" onchange="changeinsemester();"><option value="0">Select Programme</option></select><span class = "input-group-addon">6. Course</span><select id="course" name="course" class="form-control" style="width:270px;" ><option value="0">Problem solving and programming skills</option></select></div></div></div><center><div id="errordiv" style="width:400px;"></div><button type="button" class="btn btn-success">Save</button><button type="button" class="btn btn-default">Cancel</button></center></form>'; document.getElementById('displaymasterblock').innerHTML = element; $("#datetimepicker").datetimepicker({ format: "dd/MM/yyyy hh:mm:ss", todayHighlight: true, pick12HourFormat: true }); } 。那就是它。