将类型转换为各自不可为空的类型

时间:2018-02-24 05:54:23

标签: kotlin

我有一个像这样的扩展函数:

first_list = [1,2,3,4]
second_list = first_list
second_list[0]=9
print(first_list)
print(second_list)
third_list = list(first_list)
third_list[0]=8
print(third_list)

有了这个,我可以这样做:

    $table_name ='search1_ts1';
    if(isset($_POST['tablename']) && !empty($_POST['tablename'])){
        $table_name =$_POST['tablename'];
    }   
    $search_query='SELECT mobile_no, fname, cus_name '.
                  'FROM $table_name '.
                  "WHERE mobile_no LIKE 'mobile_no1%' ".
                    "AND mobile_no LIKE '%mobile_no2'";
    $conditionsql="";
    if(isset($_POST['mobile_no1'], $_POST['mobile_no2']) && 
           !empty($_POST['mobile_no1'])) {
        $conditionsql.=" mobile_no1 like '%" . $_POST['mobile_no1'] . "%'";
    }
    if(isset($_POST['mobile_no2']) && !empty($_POST['mobile_no2'])){
        $conditionsql.=" and mobile_no2 like '%" . $_POST['mobile_no2'] . "%'";

问题是,用户和密码类型仍然是可以为空的形式,所以我仍然需要使用inline fun <A, B, C> Pair<A, B>.notNull(code: (A, B) -> C) { if (this.first != null && this.second != null) { code(this.first, this.second) } } 来调用用户并传递,即使用户和传递不为空

如何将它转换为各自不可空的类型?

也许是这样的,但是对于泛型:

Pair(username, password).notNull { user, pass -> 
    // code to execute when username and password is not null
}

3 个答案:

答案 0 :(得分:2)

一般答案:

如果你声明一个泛型类或函数,他们可以在替换它们的类型params时包含nullable:

示例:

check_before.html

所以在这种情况下,尽管T没有用T标记,但消息是可以为空的吗? 因此,为了避免传递可为空的参数类型并保证始终替换非null类型,您可以将其更改为:

class Help<T>{
 fun printHelp(message :T){
     message?.render();
 }
}

答案 1 :(得分:2)

在这种情况下,智能转换不起作用,因为您正在访问在另一个模块中声明的类的属性。如果将属性值存储在局部变量中,它将起作用:

inline fun <A : Any, B : Any, C> Pair<A?, B?>.notNull(code: (A, B) -> C) {
    val first = this.first
    val second = this.second
    if (first != null && second != null) {
        code(first, second)
    }
}

答案 2 :(得分:1)

我认为这会奏效。

inline fun <A: Any, B: Any, C> Pair<A?, B?>.notNull(code: (A, B) -> C) {
    if (this.first != null && this.second != null) {
        code(this.first!!, this.second!!)
    }
}

此处,AB类型未定义为Any?的子类型。它们仅限于Any的子类型,因此它们不为空。 (当然,Any的每个子类型都是Any?的子类型。)

但是,this的类型将是Pair<A?, B?>,因此它将是一对无效的。所有非null类型都是其相应可空类型的子类型,因此任何Pair都可以调用此扩展函数。

<小时/> 编辑:对于存档,yole的答案似乎更受欢迎(不使用!!):https://stackoverflow.com/a/48960855/869330