小编inn*_*ov8的帖子

sourceSets与gradle kotlin DSL在4.10rc级别

我使用以下代码:

java.sourceSets["main"].java {
    srcDir("src/main/extraSource")
}
Run Code Online (Sandbox Code Playgroud)

在gradle 4.9中完美运行,但在4.10中rc1给出以下错误:

  Line 5: java.sourceSets["main"].java {
               ^ Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
                   public val Project.sourceSets: SourceSetContainer defined in org.gradle.kotlin.dsl
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?是否需要改变?许多其他答案(例如 ,此问题的这一个和每个建议的答案)如果已经改变,也将需要更新

kotlin gradle-kotlin-dsl

8
推荐指数
1
解决办法
777
查看次数

kotlin,如何简化向基类构造函数传递参数?

我们有一个包,我们希望将其从 python 转换为 kotlin,以便能够使用该包迁移系统。

在包中有一组类,它们都是公共基类的变体或“风味”。

大多数代码都在基类中,它具有大量可选参数。所以考虑:

open class BaseTree(val height:Int=10,val roots:Boolean=true, //......还有很多!!

class FruitTree(val fruitSize, height:Int=10, roots:Boolean=true,
  //  now need all possible parameters for any possible instance
   ):BaseTree(height=height, roots=roots //... yet another variation of same list
Run Code Online (Sandbox Code Playgroud)

代码实际上并不是树,我只是认为这是传达想法的一种简单方式。基类有大约 20 个参数,大约有 10 个子类,每个子类实际上需要重复来自基类的参数列表的相同两个变体。如果参数列表发生变化,那真是一场噩梦!

那些来自 Java 背景的人可能会评论“20 个参数太多了”,可能会错过这是可选参数,影响这方面设计的语言特性。20个必需参数会很疯狂,但10个甚至20个可选参数并不少见,例如查看sqlalchemy表

在python中,你可以调用一个基类构造函数:

def __init__(self, special, *args, **kwargs):
   super().__init(*args, **kwargs)  # pass all parameters except special to base constructor
Run Code Online (Sandbox Code Playgroud)

有没有人知道一种技术,使用不同的方法(也许使用接口或其他方法?)来避免为每个子类一遍又一遍地重复这个参数列表?

constructor base-class kotlin

6
推荐指数
1
解决办法
5364
查看次数

如何从Kotlin中的对象实例访问伴侣对象?

具有伴随对象的简单示例类

class MyClass{
  companion object{
     val test = 25
  }
}
Run Code Online (Sandbox Code Playgroud)

可以从访问值测试MyClass.test,但是如何从MyClass实例访问值呢?如果有val sample = MyClass(),我该如何从样本中访问测试? sample::class.test不正确....有办法吗?

有人提出了一个问题:“为什么不简单地使用MyClass.test”?

我倾向于将问题保留为“如何”而不是“为什么”,但是由于已经提出了要求,我将尝试“为什么”。同样也可以应用于这些方法。为什么在类中没有静态函数,而仅调用Class.function()并将对象作为参数之一传递呢?

在处理作为更抽象的基类传递的对象时,请考虑一下,与所使用的对象可能具有多个类。

您可以为每个可能的类进行切换,并以这种方式访问​​相应类的值(或函数),但是多态的想法是您应该能够像方法一样访问类属性(即使函数方法代码对于同一个类的所有成员),或者该类的一个对象实例中该类的所有成员共有的值。

到目前为止,我的解决方案是简单地将test中的MyClass等效实现为静态

public class MyClass {
    static Integer test = 25;
    public Integer testGetter(){ return test;}

}
Run Code Online (Sandbox Code Playgroud)

在Java,C ++,python等中,有简单的解决方案...(我将为每个示例提供代码示例,这对我有帮助),我认为kotlin中将有比使用Java更好的解决方案。

如果在没有对象实例的情况下访问类属性(例如工厂),则kotlin伴随对象为static提供了一种替代方法(并且有很多优点),但是对于静态的另一种用法是尽管对象实例可能可用, static是适当的,因为类的所有成员都可以共享单个属性,并且该属性与实例无关。

kotlin companion-object

5
推荐指数
2
解决办法
5886
查看次数

Kotlin安全地从字符串转换为枚举

我需要将字符串转换为Enum值,但是想要一个如果字符串不是枚举则返回null的函数。

enum class Colors{
   Red, Green, Blue

} 
Run Code Online (Sandbox Code Playgroud)

我可以使用Colors.valueOf(testString),只要testString是value,但是如果它无效则会有一个例外,在这种情况下我希望为null。

因为我经常想要这样做,所以扩展功能将是理想的。但是扩展需要对Colors类进行操作,而不是对Colors类型的对象进行操作。

有人知道怎么写这样的扩展名吗?理想情况下,对于任何枚举类都是通用的。

编写顶层函数很简单,但是我正在寻找一个充当标准“方法”的函数

// instead of 
val willGetAnException = Colors.valueOf("Yellow") // standard existing fun
val willGetNull = Colors.valueOrNullOf("Orange")  // new fun i seek
Run Code Online (Sandbox Code Playgroud)

理想情况下,它是通用的并且适用于任何枚举

enums kotlin

3
推荐指数
3
解决办法
2499
查看次数

无需使用正则表达式即可有效地将 Kotlin 字符串分解为固定长度的子字符串

显然,分割可用于将字符串分解为特定字符或分隔符字符串的子字符串,但我一直在寻找任何简单的方法来分解为固定长度的子字符串。例如。

"abcde".splitAt(2) == listOf("ab", "cd", "e")
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

kotlin

3
推荐指数
1
解决办法
433
查看次数