Java에서는 아래와 같은 코드를 사용합니다.
public class GenericTest {
private static final GenericTest instance = new GenericTest();
IRequirement requirement;
public static GenericTest getInstance() {
return instance;
}
public class ClassA {}
public interface InterfaceA {}
public void init(IRequirement requirement){
this.requirement = requirement;
}
public interface IRequirement {
<T extends ClassA & InterfaceA> T supply();
}
class ClassB {
void doSomeThing() {
ClassA a = requirement.supply();
InterfaceA ia = requirement.supply();
}
}
}
내 필요에 따라 ClassA
또는 InterfaceA
인스턴스 를 얻을 수 있습니다 . 그러나 kotlin에서는 아래와 같은 코드가 있습니다.
open class ClassA(val name: String) {
fun function1() {}
fun function2() {}
}
interface InterfaceA {
fun iFunction1()
}
class ModuleX private constructor() {
var requirement: IRequirement? = null
companion object {
val instance = ModuleX()
}
fun init(requirement: IRequirement) {
instance.requirement = requirement
}
interface IRequirement {
fun <T> supply(): T where T : ClassA, T : InterfaceA
}
}
object ClassB {
inline fun <reified T> doSomeThing() where T : ClassA, T : InterfaceA{
val require = ModuleX.instance.requirement?.supply<T>()
require?.function1()
require?.iFunction1()
}
fun doAnotherThing() {
// IDE give an error when calling supply()
val require = ModuleX.instance.requirement?.supply()
require?.function1()
require?.iFunction1()
}
}
제네릭의 실제 유형을 지정하거나 제네릭 메소드를 사용해야합니다. 그렇지 않으면 IDE IRequirement
에서 ClassB.doAnotherThing()
"유형 추론 실패 : 매개 변수 T를 추론 할 수있는 정보가 충분하지 않습니다."라는 오류가 발생하는 경우 와 같이 위 코드에서 를 사용할 수 없습니다 . fun supply () : T 여기서 T : InterfaceA 명시 적으로 지정하십시오. "
내 질문은 : 내 모듈에서 ClassA를 확장하고 InterfaceAd를 구현하는 클래스를 제공해야하지만 모듈이 모듈 외부에 있기 때문에 클래스의 정확한 유형을 알지 못합니다. 이 경우 제네릭을 어떻게 사용해야합니까?
fun doAnotherThing() {
val require: Any? = ModuleX.instance.requirement?.supply()
if (require != null) {
(require as ClassA).function1()
(require as InterfaceA).iFunction1()
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다