那么有通配符上界 extends T>,自然就会有下界, super T>,其中 T 就表示通配符的下界。
举个栗子:Collection super String> 是 Collection 的父类型,所以可以直接 add 和 set,但是 get 的时候获取到的类型是 Object 而不是 String 类型。
List<String> strs = new ArrayList<String>();
strs.add("0");
strs.add("1");
List super String> objs = strs;
objs.add("1");
objs.set(0, "2");
Object s = objs.get(0);
在 Kotlin 中,并没有上面的机制,而是通过 Declaration-site variance 和 Type projections 来执行的。
泛型函数
Kotlin 同样支持泛型函数:
fun <T> singletonList(item: T): List<T> {
// ...
}
fun <T> T.basicToString() : String { // extension function
// ...
}
使用的时候,在函数名称后面指定具体的类型参数:
val l = singletonList(1)
声明位置变化
声明位置变异:通过将参数 T 注解成只能作为返回值,不能作为传入参数;使用 out 关键字标识。 首先我们来看一下,在 Java 中,
abstractclass Source {
// 使用out的话,T只能作为返回值abstractfun nextT(): T
// 不能作为传入参数,下面会报错// abstract fun add(value: T)
}
fun demo(strs: Source) {
val objects: Source = strs
}
有 out 就有 in,in 与 out 互补,它使类型参数逆变 contravariant,只能作为传入参数,不能作为返回值:
abstractclass Source<in T> {
// 使用in的话,只能作为传入参数,不能作为返回值// abstract fun nextT(): Tabstractfun add(value: T)
}
fun demo(strs: Source) {
val objects: Source = strs // Double是Number的子类型
}
总结一下,当一个泛型类 C,包含 out 关键字的时候,等同于 Java 的 extends,将类 C 称为 T 的协变类,T 只能作为该类中函数的返回类型,不能作为参数传递进来,也可以称类 C 为 T 的生产者(Producer)。
同理,当包含 in 关键字的时候,等同于 Java 的 super,将类 C 称为 T 的逆变类,T 只能作为该类中函数的参数传递进来,不能作为返回类型,也可以称类 C 为 T 的消费者(Consumer)。
可以将上面两段话总结成:
Consumer in, Producer out!
fun copy(from: Array, to: Array<in String>) {
assert(from.size == to.size)
for (i infrom.indices)
to[i] = from[i]
}
// 等同于
public void copy(List extends String> from, List super String> to) { ... }
返回做IO数目最多的50条语句以及它们的执行计划。
select top 50
(total_logical_reads/execution_count) as avg_logical_reads,
(total_logical_writes/execution_count) as avg_logical_writes,
(tot
The CUDA 5 Release Candidate is now available at http://developer.nvidia.com/<wbr></wbr>cuda/cuda-pre-production. Now applicable to a broader set of algorithms, CUDA 5 has advanced fe
Essential Studio for WinRT界面控件包含了商业平板应用程序开发中所需的所有控件,如市场上运行速度最快的grid 和chart、地图、RDL报表查看器、丰富的文本查看器及图表等等。同时,该控件还包含了一组独特的库,用于从WinRT应用程序中生成Excel、Word以及PDF格式的文件。此文将对其另外一个强大的控件——网格控件进行专门的测评详述。
网格控件功能
1、
Project Euler是个数学问题求解网站,网站设计的很有意思,有很多problem,在未提交正确答案前不能查看problem的overview,也不能查看关于problem的discussion thread,只能看到现在problem已经被多少人解决了,人数越多往往代表问题越容易。
看看problem 1吧:
Add all the natural num
Adding id and class names to CMenu
We use the id and htmlOptions to accomplish this. Watch.
//in your view
$this->widget('zii.widgets.CMenu', array(
'id'=>'myMenu',
'items'=>$this-&g
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note:
Elements in a subset must be in non-descending order.
The solution set must not conta