【问题标题】:How to apply actions to generic types in class this is working with generics如何在使用泛型的类中将操作应用于泛型类型
【发布时间】:2019-03-01 14:38:32
【问题描述】:

我现在正试图弄清楚泛型是如何工作的。我找到了这个例子

class SomeGenericClass <T> {

    fun <T> makeSomething(someData : T) : T {
       var localData = someData
       //... doing some actions
       return localData
   }
}

我现在想知道 - 我们如何对作为参数传递给 ma​​keSomething 方法的泛型类型应用一些操作。有可能吗?我们能否对 someData 应用一些操作或更改(不是可以使用 Any 对象 -toString、hashCode 完成的基本操作)。我认为这是不可能的,对吗? 或者这个例子:

fun <T> doJob(valOne: T, valTwo: T){

}

我们不能对 valOne 和 valTwo 对象应用任何操作。在这两种情况下,我们都需要扩展基本类或接口并覆盖这些方法?

【问题讨论】:

    标签: generics kotlin generic-programming


    【解决方案1】:

    如果您限制 T 类型可以是什么,则可以在具有泛型类型参数的实例上使用方法,例如:

    fun <T : CharSequence> useThing(thing: T) {
        println(thing)
    }
    

    处理传入的对象的另一种方法是提供一个对其进行操作的 lambda,它接收相同的泛型类型。在调用站点,这将使其参数作为实际类型可用:

    fun <T> performActions(thing: T, actions: (T) -> Unit) {
        actions(thing)
    }
    
    performActions(25) { thing: Int ->
        println(3 * thing) 
    }
    

    第二个示例虽然不是很明智,但例如您可以在第二个示例中多次执行该操作。

    【讨论】:

      【解决方案2】:

      问题是:你想用它们做什么?

      正如所写,您对T 的唯一了解是它是某种类型——因为您不知道哪个 类型,所以您不能做任何特定于类型的事情。因此,您可以对 T 类型的值做的唯一事情是适用于 all 类型的事情 - 即您可以使用 Any? 做的事情。这包括将它们与其他类型(或null)进行相等性(或身份)比较,将它们转换为Strings,将它们存储在集合中,等等。

      要进一步了解,您需要更多地了解T 是什么类型。例如,如果您知道它是 CharSequence(例如 String),那么您可以通过提供类型绑定来告诉编译器,例如&lt;T : CharSequence&gt;.

      然后你可以用T 做任何你可以用CharSequence 做的事情,比如获取它的长度、迭代或映射它的字符,&c。 (根据zsmb13's answer)。但是,编译器会阻止您使用不相关的类调用它。

      因此,对于泛型(与任何其他代码一样),您可以对对象做什么取决于您对其类型的了解。

      (顺便说一句,您引用的代码有点误导,因为它有两个不同的类型参数,称为T:一个在类级别,另一个在函数中。如果您的意思是相同的T in这两种情况,那么您可能希望从函数定义中删除 &lt;T&gt;。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 2022-10-14
        相关资源
        最近更新 更多