我使用以下代码:
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)
有任何想法吗?是否需要改变?许多其他答案(例如 ,此问题的这一个和每个建议的答案)如果已经改变,也将需要更新
我们有一个包,我们希望将其从 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)
有没有人知道一种技术,使用不同的方法(也许使用接口或其他方法?)来避免为每个子类一遍又一遍地重复这个参数列表?
具有伴随对象的简单示例类
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是适当的,因为类的所有成员都可以共享单个属性,并且该属性与实例无关。
我需要将字符串转换为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)
理想情况下,它是通用的并且适用于任何枚举
显然,分割可用于将字符串分解为特定字符或分隔符字符串的子字符串,但我一直在寻找任何简单的方法来分解为固定长度的子字符串。例如。
"abcde".splitAt(2) == listOf("ab", "cd", "e")
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?