Kotlin中的可选通用参数

时间:2019-12-29 22:04:21

标签: generics kotlin

这是我要解决的当前问题,我们在Kotlin中具有以下界面:

interface Parent<out Result, in Params> where Result : Any {
    fun run(params: Params): Result
}

这里的问题是,有时我不想将任何参数传递给接口,因此我最终将Unit传递为类型参数,并且覆盖的类最终看起来像这样:

class Child : Parent<String, Unit> {
    override fun run(params: Unit): String { ... }
}

最终目标:添加一些抽象以便在runParams的情况下完全获取没有参数的Unit函数是很不错的 喜欢:

class Child : Parent<SomeEntity, Unit> {
    override fun run(): Entity { ... }
}

甚至更好的是,可以选择传递第二个类型参数,以使单个类具有一个或两个类型参数。

class Child : Parent<String> {
    override fun run(): Entity { ... }
}

具有参数的同一父类

class Child : Parent<String, Int> {
    override fun run(params: Int): String { ... }
}

这有可能吗?

2 个答案:

答案 0 :(得分:2)

您可以创建一个扩展函数来处理Parent,其中第二种类型是Unit。仅当第二种类型与单位匹配时,该功能才可用:

fun <Result> Parent<Result, Unit>.run() = run(Unit)

您使用的术语是非典型的。实现接口的类不是该接口的子级。它是任何超类的孩子。

答案 1 :(得分:1)

我认为您不能通过单个界面执行任何特殊操作。 ?‍♂️
我想到的一个解决方案是创建一个具有单个类型参数的子接口,该子接口将覆盖#include <stdio.h> #include <Windows.h> int main() { LPCSTR dllpath = "C:\\Users\\......\\Dll1.dll"; printf("#### Starting ####\n"); printf("step 1: attaching the target process memory\n"); HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, 6456 // target process id ); if (hProcess != NULL) { printf("step 2: allocate the target memory process\n"); LPVOID dllPathMemoryAddr = VirtualAllocEx( hProcess, NULL, strlen(dllpath), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE ); if (dllPathMemoryAddr != NULL) { printf("step 3: write to the process memory\n"); BOOL succeededWriting = WriteProcessMemory( hProcess, dllPathMemoryAddr, dllpath, strlen(dllpath), NULL ); if (succeededWriting) { printf("step 4: execute.\n"); FARPROC loadLibAddr = GetProcAddress( GetModuleHandle(TEXT("kernel32.dll")), "LoadLibraryA" ); HANDLE rThread = CreateRemoteThread( hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)loadLibAddr, dllPathMemoryAddr, 0, NULL ); } } CloseHandle(hProcess); } return TRUE; } 函数,该函数委托给另一个不带参数的函数。
像这样:

#### Starting ####
step 1: attaching the target process memory
step 2: allocate the target memory process
step 3: write to the process memory
step 4: execute.