像java这样的东西
int a = 1, b = 2, c = 1;
if ((a = b) !=c){
System.out.print(true);
}
Run Code Online (Sandbox Code Playgroud)
现在它应该转换为kotlin之类的
var a:Int? = 1
var b:Int? = 2
var c:Int? = 1
if ( (a = b) != c)
print(true)
Run Code Online (Sandbox Code Playgroud)
但这不正确.
这是我得到的错误:
in " (a=b)" Error:(99, 9) Kotlin: Assignments are not expressions, and only expressions are allowed in this context
Run Code Online (Sandbox Code Playgroud)
实际上,上面的代码只是澄清问题的一个例子.这是我的原始代码:
fun readFile(path: String): Unit {
var input: InputStream = FileInputStream(path)
var string: String = ""
var tmp: Int = -1 …Run Code Online (Sandbox Code Playgroud) 说我有一个字符串:"Test me".
我该如何将其转换为:"Test me"?
我尝试过使用:
string?.replace("\\s+", " ")
Run Code Online (Sandbox Code Playgroud)
但似乎这\\s是Kotlin的非法逃脱.
不要with和run有唯一不同的语法相同的功能,或者是有之间的主要差异with和run?
哪种方法适当?
adapter.run {
notifyDataSetChanged()
if (activityDetails.isEmpty())
emptyText.visibility = View.VISIBLE
else
emptyText.visibility = View.GONE
}
with(adapter){
notifyDataSetChanged()
if (activityDetails.isEmpty())
emptyText.visibility = View.VISIBLE
else
emptyText.visibility = View.GONE
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试将Kotlin引入我当前的项目中.我决定从实体开始,这些实体似乎完美地映射到数据类.例如,我有一个数据类:
data class Video(val id: Long, val ownerId: Long, val title: String, val description: String? = null,
val imgLink: String? = null, val created: Date? = null, val accessKey: String? = null,
val views: Long? = null, val comments: Long? = null, val videoLink: String? = null): Entity
Run Code Online (Sandbox Code Playgroud)
其中实现了Java接口:
public interface Entity {
Long getId();
}
Run Code Online (Sandbox Code Playgroud)
但由于某些原因,编译器不理解该方法已经实现:
类'Video'必须声明为abstract或实现抽象成员public abstract fun getId():kotlin.Long!在net.alfad.data.Entity中定义
我是否必须为id param使用任何其他关键字?什么"!" 签名意味着什么?
请告诉我,这个例子中是否存在任何差异(就Java而言):
object DefaultValues {
val FILES_TO_DOWNLOAD = 100
}
Run Code Online (Sandbox Code Playgroud)
和
class DefaultValues {
companion object {
val FILES_TO_DOWNLOAD = 100
}
}
Run Code Online (Sandbox Code Playgroud)没有类或对象包装器:
const val DEFAULT_FILES_TO_DOWNLOAD = 100
Run Code Online (Sandbox Code Playgroud)
和
val DEFAULT_FILES_TO_DOWNLOAD = 100
Run Code Online (Sandbox Code Playgroud)定义的真正方法是什么?:
public static final int FILES_TO_DOWNLOAD = 100
Run Code Online (Sandbox Code Playgroud) 我正在尝试将以下代码转换为Kotlin,并且仍然使用Java使用的一个类(Foo).进行此转换的正确方法是什么?
原始Java:
public class Foo {
public static final String C_ID = "ID";
public static final String C_NAME = "NAME";
public static final String[] VALUES = {"X", "Y", "Z"};
public static String[] getAll() {
return new String[] {C_ID, C_NAME};
}
}
public class Bar {
public void doStuff() {
String var1 = Foo.C_ID;
String[] array1 = Foo.VALUES;
String[] array2 = Foo.getAll();
}
}
Run Code Online (Sandbox Code Playgroud)
自动转换Foo到Kotlin
object Foo {
val C_ID = "ID"
val C_NAME = "NAME"
val VALUES = arrayOf("X", "Y", …Run Code Online (Sandbox Code Playgroud) 在Kotlin中,函数声明语法允许您在花括号之前写入等号.考虑这两个例子:
没有=标志:
fun foo() {
bar()
println("baz")
}
Run Code Online (Sandbox Code Playgroud)
只需调用即可执行正文中的代码foo().
带=标志:
fun foo() = {
bar()
println("baz")
}
Run Code Online (Sandbox Code Playgroud)
在这里,当foo()被调用时,没有任何事情发生,但为了让身体执行,可以写foo()().
这两个声明有什么不同,为什么它们的表现不同?
使用reified类型参数,可以编写一个内联函数,该函数在运行时通过反射与type参数一起使用:
inline fun <reified T: Any> f() {
val clazz = T::class
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是当f使用一个本身就是泛型类的参数调用时,似乎无法通过以下方式获取其实际类型参数T::class:
f<List<Integer>>() // T::class is just kotlin.collections.List
Run Code Online (Sandbox Code Playgroud)
有没有办法通过反射获得具体通用的实际类型参数?
我在我的代码中有一个场景,我想要一个类来实现两个不同类型的接口,比如这个例子:
interface Speaker<T> {
fun talk(value: T)
}
class Multilinguist : Speaker<String>, Speaker<Float> {
override fun talk(value: String) {
println("greetings")
}
override fun talk(value: Float) {
// Do something fun like transmit it along a serial port
}
}
Run Code Online (Sandbox Code Playgroud)
Kotlin对此不满意,引用:
Type parameter T of 'Speaker' has inconsistent values: kotlin.String, kotlin.Float
A supertype appears twice
Run Code Online (Sandbox Code Playgroud)
我知道一个可能的解决方案是实现以下代码,我在其中实现接口,<Any>然后自己检查类型并将它们委托给它们的函数.
interface Speaker<T> {
fun talk(value: T)
}
class Multilinguist : Speaker<Any> {
override fun talk(value: Any) {
when (value) {
is String -> …Run Code Online (Sandbox Code Playgroud) 在Java的Javadoc中,有一种方法可以使用{@inheritDoc}标记在子类中继承方法的文档.
有没有办法在Kotlin的KDoc中做同样的事情?
基本上,我想做的是以下内容:
abstract class Base {
/**
* Some KDoc documentation here.
*/
abstract fun foo()
}
class Derived: Base() {
/**
* Here is all the documentation from Base#foo's KDoc inherited.
*
* And here goes something more in addition.
*/
override fun foo() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud) kotlin ×10
generics ×2
java ×2
data-class ×1
field ×1
function ×1
interface ×1
javadoc ×1
kdoc ×1
kotlin-dokka ×1
overriding ×1
properties ×1
reflection ×1
static ×1