我想创建一个可以在我的 Android 应用程序中重复使用的 Kotlin 库。然而我不希望它成为一个 Android 库,因为我希望将它连接到一些测试和模拟框架。
在我的 Android 应用程序中,我右键单击顶级应用程序节点并执行操作,New -> Module然后选择Java Library. 然而,在新的 Java 库中,Kotlin 似乎仅得到部分支持。语法大部分有效,但其他部分则无效。
例如,forEach在 my 上HashMap未解决并尝试对其进行索引,例如items[0]. 我以正确的方式处理这件事吗?
我正在用C编写一个小的API库模块.我将编译这个模块并将它交给我的开发人员,我将在我的模块的头文件中公开一些必需的函数,这样开发人员将使用我的模块知道调用哪个函数用于所需的功能.现在我想询问一件事:我是否可以只在C中公开所需的功能
我有test.c有:
#include "test.h"
void A()
{
if( some condition is true )
B();
else
return;
}
void B()
{
//some code here
}
Run Code Online (Sandbox Code Playgroud)
在test.h中,我只暴露了一个函数,即
void A();
Run Code Online (Sandbox Code Playgroud)
现在B()明显依赖于放入A()的条件,否则它不能运行,因为只有A()在test.h中公开,那么用户不会知道他/她也可以直接调用B().现在我担心的是,如果用户知道(或猜测)我的模块中有一些名为B()的函数可以绕过A()直接调用,那么它可能会影响我的实现.
我知道在这种情况下C++会更好,因为公共和私有方法,我也有一个想法,我可以通过在B()中使用A()的一些标志检查来阻止B()直接调用,但我想知道如果有任何其他方法,以便用户无法调用我的函数(如B()),这些函数未在头文件中公开.
我已经将某些Postgresql类型添加到Exposed作为扩展。它有两个就绪类型,分别名为enumeration和enumerationByName。我测试了这两者,但都没有成功将Postgre枚举类型映射到Kotlin枚举类。在读写中都会引发错误
enum class TicketStatus(val status: String) {
Open("open"),
Close("close"),
InProgress("in_progress")
}
class Ticket(id: EntityID<UUID>) : Entity<UUID>(id) {
companion object : EntityClass<UUID, Ticket>(Tickets)
var geom by Tickets.geom
var description by Tickets.description
var status by Tickets.status
var createdAt by Tickets.createdAt
var updatedAt by Tickets.updatedAt
var owner by Tickets.owner
}
Run Code Online (Sandbox Code Playgroud)
阅读时:
java.lang.IllegalStateException: open is not valid for enum TicketStatus
Run Code Online (Sandbox Code Playgroud) 在Java中,我可以使用以下代码:
public class Ex {
public static void main(String [ ] args) {
String path = Ex.class.getProtectionDomain().getCodeSource().getLocation().getPath();
String decodedPath = URLDecoder.decode(path, "UTF-8");
}
}
Run Code Online (Sandbox Code Playgroud)
但是在Kotlin中,主要功能是在课外定义的.我怎样才能得到它的当前文件名?
我正在尝试转换Java方法:
private <T> Callable<T> createCallable(final Callable<T> task) {
return () -> {
try {
return task.call();
} catch (Exception e) {
handle(e);
throw e;
}
};
}
Run Code Online (Sandbox Code Playgroud)
从以下Java文件ExceptionHandlingAsyncTaskExecutor.java进入Kotlin。
该代码使用IntelliJ IDEA自动转换为:
private fun <T> createCallable(task: Callable<T>): Callable<T> {
return {
try {
return task.call()
} catch (e: Exception) {
handle(e)
throw e
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是不正确的。但是我必须考虑应该采用哪种正确的实现方式。有任何想法吗?
如何使用界面创建点击事件?
在我的应用程序中,我创建了视图点击界面,以检测单击适配器项目到父活动.在将接口和方法创建到适配器之后如何使用此接口来调用视图侦听器?
class CacheEntry<T>(val value: T, val size: Long)
interface Cache<T>{
val NO_ENTRY_FOUND : CacheEntry<T>
}
class CacheImpl<String> : Cache<String>{
override val NO_ENTRY_FOUND = CacheEntry<String>(value = "not_found", size = -1)
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
错误:(12, 65) Gradle:类型不匹配:推断类型为 kotlin.String,但预期为 String
我不明白为什么这不起作用。
Kotlin有一个名为字符串模板的功能.在字符串中使用可空变量是否安全?
override fun onMessageReceived(messageEvent: MessageEvent?) {
Log.v(TAG, "onMessageReceived: $messageEvent")
}
Run Code Online (Sandbox Code Playgroud)
将上面的代码抛出NullPointerException,如果messageEvent是null?
这是否意味着列表项可以String是非String?我在以下代码中找到了用法:
class KotlinGreetingJoiner(val greeter: Greeter) {
val names = ArrayList<String?>()
fun addName(name: String?) {
names.add(name)
}
fun getJoinedGreeting(): String {
val joiner = Joiner.on(" and ").skipNulls()
return "${greeter.getGreeting()} ${joiner.join(names)}"
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
fun main(args: Array<String>) {
val urlForCSR: URL = ClassLoader.getSystemClassLoader().getResource("merchant.id")
// also tried ClassLoader.getSystemResource("merchant.id")
...
Run Code Online (Sandbox Code Playgroud)
从intelliJ运行时,以下工作正常并找到资源.但是当使用捆绑的jar运行它时会给出一个NullPointerException.
/src/main/resources/merchant.id/src/main/java/Route.kt以下是Maven配置代码段:
...
<!-- Make this jar executable -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>RouteKt</mainClass> <!-- Class generated (for above main func - named Route.kt) -->
</manifest>
</archive>
</configuration>
</plugin>
<!-- Includes the runtime dependencies -->
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
<executions>
<execution>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
Run Code Online (Sandbox Code Playgroud)
有没有其他的战争来获取上述资源的URL,这可以使用一个jar或其他方式制作一个胖罐.
Jar内容:
jar tf target/Route-1.0-SNAPSHOT.jar
META-INF/
META-INF/MANIFEST.MF
merchant.id
RouteKt$main$1.class …Run Code Online (Sandbox Code Playgroud) 我想.MAX在通用枚举上表示值计数.
我试着玩一点,但我想不出来.
当我写作时,例如,这个:
val Enum.Companion.MAX get() = enumValues().size
它抱怨enumValues()说
类型推断失败:没有足够的信息来推断参数T in
inline fun> enumValues():Array请明确指定它.
这很有道理,然后我也试过了:
val <E> Enum<E>.Companion.MAX get() = enumValues().size
它抱怨第二个 E
引用嵌套类时,外部类的类型参数是多余的
有办法吗?
我不知道如何解释,所以这是我的代码:
this.Invoke(listBox1.Items.Add, new Object[] { e.Data.ToString() });
Run Code Online (Sandbox Code Playgroud)
但是,如果我没有任何错误,一切都会好的,但遗憾的是我有2个错误:
错误1
'System.Windows.Forms.Control.Invoke(System.Delegate,params object [])'的最佳重载方法匹配有一些无效的参数
错误2
参数1:无法从'方法组'转换为'System.Delegate'
我该怎么做才能克服这些异常?
使用Java的反射时,我可以这样做:
method.getParameterTypes()[i]这给了我参数的i类型(Class).
如何使用Kotlin实现这一目标KCallable?我尝试过做这样的事情:callable.parameters[i].type但我发现的唯一一件事就是type.javaType它返回Type了根本没有帮助我的东西.我也尝试了,parameters[i].kind但这根本没有帮助我.
如何method.getParameterTypes()使用Kotlin 进行Java KCallable?