Kotlin學習筆記系列:http://blog.csdn.net/column/details/16696.html
class TypedClass<T>(param : T){
...
}
val s = TypedClass<String>("hello")
val s = TypedClass("hello")
val s = TypedClass<String?>(null)
class TypeClass<T : Any>(param : T){
...
}
class TypedClass<T : Context>(param : T){
....
}
這樣所有繼承至Context的類可以使用,其他則不能。fun <T> do(param : T) List<T>{
...
}
List<String> list1 = Lists.newArrayList();
List<Object> list2 = list1
就會報錯,雖然List<Object>有更弱的限制,因爲如果編譯器允許這種行爲,後面如果出現下面的代碼就一定會程序崩潰。list2.add(5);
String s = list2.get(0);
但是在java中,我們可以使用addAll,如List<Object> list2 = Lists.newArrayList();
list2.addAll(list1)
這時因爲addAll的函數接收的參數是“Collection<? extends E> items”,這裏就用到了泛型的協變。List<? extends Object> list2 = list1;
但是通配符都有它的限制,通配符定義的了使用場景變體(use-site variance),當我們使用它的時候都需要聲明它。這表示我們每次聲明一個泛型變量都需要增加模板代碼。例如上面的代碼就增加了一下額外的模板代碼。class TypedClass<out T>{
...
}
val obj1 = TypedClass<String>()
val obj2 : TypedClass<Any> = obj1
這段代碼可以在kotlin中編譯運行(最後一行實際上就相當於val obj2 : TypedClass<? extends Any> = obj1)val intent = Intent(MainActivity@this, javaClass<DetailActivity>)
intent.putExtra(DetailActivity.ID, item.id)
intent.putExtra(DetailActivity.NAME, item.name)
startActivity(intent)
startActivity<DetailActivity>(DetailActivity.ID to item.id, DetailActivity.NAME to item.name)
vararg params: Pair<String, String>) {
val intent = Intent(this, T::class.javaClass)
params forEach { intent.putExtra(it.first, it.second) }
startActivity(intent)
with(context){
startActivity<...>(...)
}