Tag: 泛型

Kotlin抽象类与泛型参数和使用类型参数的方法

我想创建一个抽象类与泛型参数将有子类应该调用方法, 而不必指定类型参数 。 我到目前为止: abstract class AbstractClass<T : Any> @Autowired constructor(protected val delegate: MyService) { inline fun <T: Any> myMethod(param: Any): T? { return delegate.myMethod(param).`as`(T::class.java) } } 并执行: class TesterWork @Autowired constructor(delegate: MyService) : AbstractClass<Tester>(delegate) { } 现在当调用myMethod我必须指定类型参数: testerWork.myMethod<Tester>("test") 我想知道是否有可能自动推断类型的参数? 我可以以某种方式重做myMethod吗? 请注意,我需要在方法内部有T::class.java 。

在kotlin中创建新的泛型类实例的正确方法是什么?

我使用以下初始化: val entityClass = javaClass<Class<T>>() var entity = entityClass.newInstance().newInstance() 但它是错误的,并导致java.lang.Class.newInstance(Class.java:1208) IllegalAccessException

如何获得Kotlin中实际泛型参数的实际类型参数?

使用指定的类型参数 ,可以编写一个内联函数,它可以在运行时通过反射来处理类型参数: inline fun <reified T: Any> f() { val clazz = T::class // … } 但是当用一个本身是一个泛型类的参数调用f时,似乎没有办法通过T::class获得它的实际类型参数: f<List<Integer>>() // T::class is just kotlin.collections.List 有没有办法通过反射来获得实际的泛化类型的类型参数?

在Scala 2.10中泛化的泛型

在Scala中缺乏具体的泛型是最让我感到困惑的,因为简单的东西不能使用复杂的构造来实现。 Kotlin和Ceylon都支持泛化的泛型,所以它绝对可以在JVM之上这样做。 过去有人说,如果没有JVM的改变,Scala就不能支持它们,但是现在Scala 2.10被传言对于物化的支持有限。 所以我的问题是: 我们可以期望在Scala 2.10中实现物化,例如,我能否多次实现一个通用的特性 ? 它是多么有限? 如果斯卡拉2.10的物化结果比科特林和锡兰更有限。 这是为什么 ?

Koltin泛型声明 – 站点方差<T>构造

我正在阅读kotlin没有通配符的原因( https://kotlinlang.org/docs/reference/generics.htm l)。 这一切都来到声明网站的变化。 我们有<in T>和<out T>结构应该取代通配符。 我想我明白了<out T>是如何运作的,但我却在<in T>遇到麻烦。 所以在java中,我们可以这样写: public List<? extends Number> list1; public List<? super String> list2; 初始化后的第一种情况变成只读列表(虽然不是完全不可改变的原因,我们可以清除它),如果我们把每个元素都视为数字,就可以读取它们。 第二种情况是只写(尽管我们可以阅读它,如果我们把每个元素作为对象)。 我们可以写那里字符串和它的子类。 在Kotlin中,我能够像这样使用<out T>重新创建list1示例: class Service { val container = Container(mutableListOf("1", "2", "3")) } class Container<T>(var list1: MutableList<out T>) 最后我尝试了一些类似于<in T>东西,认为我可以重新创建list2的例子,但是我失败了: 有人可以向我解释如何在Kotlin中实现我的list2例子吗? 我应该如何正确使用<in T>结构?

我必须分配什么编译时类型才能获得java.util.Map的返回值<TextAttribute,?>

我想从另一个字体派生出一个字体。 这是我想要做的: val font : Font = this.label.getFont(); val attributes : Map<TextAttribute, Any> = font.getAttributes(); attributes.put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); this.label.setFont(font.deriveFont(attributes)); 但是,Kotlin编译器在这一行上抱怨: val attributes : Map<TextAttribute, Any> = font.getAttributes(); 随着消息: Type mismatch: inferred type is (Mutable)Map<TextAttribute!, *>! but Map<TextAttribute, Any> was expected 根据我对Java泛型的有限理解,我明白font.getAttributes()返回一个java.util.Map<TextAttribute, ?> ; 后一种类型的参数意味着当你从这个映射中创建一个有界/关闭的泛型类型时,请指定作为第二个类型参数的任何扩展java.lang.Object的东西 。 所以,当我首先尝试了以下几行: val attributes : java.util.Map<TextAttribute, Object> = font.getAttributes(); Kotlin编译器说: 这个类不应该在Kotlin中使用。 改为使用kotlin.collections.Map或kotlin.collections.MutableMap。 […]

Array <T?>是什么意思

将Java代码转换为Kotlin时, public MayData[] getDataArray() { return new MayData[0]; } 变成 fun getDataArray(): Array<MyData> { return arrayOfNulls<MyData>(0) } 但我得到一个错误: Error:(50, 16) Type mismatch: inferred type is Array<MyData?> but Array<MyData> was expected 它必须添加'?' fun getDataArray(): Array<MyData?> { return arrayOfNulls<MyData>(0) } “?”是什么? 是指模板类型?

Kotlin:手动内联泛型函数会产生不同的结果?

我有一个简单的测试课 class SimpleClassTest { private fun <T> anyObject(): T { return Mockito.anyObject<T>() } lateinit var simpleObject: SimpleClass @Mock lateinit var injectedObject: InjectedClass @Before fun setUp() { MockitoAnnotations.initMocks(this) } @Test fun testSimpleFunction() { simpleObject = SimpleClass(injectedObject) simpleObject.simpleFunction() verify(injectedObject).settingDependentObject(anyObject()) } } 它工作正常,并通过。 由于私有泛型anyObject()函数只能使用一次,所以我决定内联(手动),即删除该函数的需要,从而改变 verify(injectedObject).settingDependentObject(anyObject()) 至 verify(injectedObject).settingDependentObject(Mockito.anyObject<DependentClass>()) 然而,现在错误为java.lang.IllegalStateException: Mockito.anyObject<DependentClass>() must not be null 任何我做错了内联函数调用直接陈述? 使用之间有什么不同吗? private fun <T> […]

如何在Kotlin中编写一个通用的扩展方法?

在我正在开发的一个项目中,我发现自己为某些类型编写了一些扩展方法,如果可选项为null,则返回一个默认值。 例如,我可能有一个Boolean? 对象,我想在默认为false的条件表达式中使用它,所以我会写: if (myOptional?.default(false)) { .. } 我已经写了几种类型: fun Boolean?.default(default: Boolean): Boolean { return this ?: default } fun Long?.default(default: Long): Long { return this ?: default } fun Int?.default(default: Int): Int { return this ?: default } 我想知道是否有办法做到这一般,所以我可以写一个扩展方法,我可以使用所有类型?

匕首2与Kotlin,在ApplicationComponent中返回泛型类型

我想返回与泛型类型被子图公开,问题是在自动生成的Java类,我试图做一些事情,但解决它的一种方法是从AppComponent中删除泛型类型,并返回简单的对象。 有更多的“正确”的方法? 这是AppComponent @Singleton @Component(modules = arrayOf(ApplicationModule::class)) interface ApplicationComponent { fun inject(activity: BaseActivity<MvpView, MvpPresenter<MvpView>>) //… fun dataBase(): Database<Realm> } 这里是ApplicationModule中的函数 @Provides @Singleton fun provideDatabase(@AppContext context: App): Database<Realm> { Realm.init(context) val config = RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .name("db") .build() Realm.setDefaultConfiguration(config) return RealmDatabase(Realm.getDefaultInstance()) } 然后我想收到我的数据库 @Provides @ActivityScope fun provideDich(database: Database<Realm>) = Someobject(database) 然后我看到日志说: **Error:com.test.data.storage.Database<? extends io.realm.Realm> cannot be provided […]