Tag: generics

你如何编写types参数的类的二级构造函数?

假设我有下面的类,并带有一个types参数T(在这个例子中它是有界的,以帮助说明后面的例子,但是当它是无界的时候,错误仍然存​​在): class GenericsTest(private var cs: T) 现在假设我想为这个类添加一个辅助构造函数。 我怎样才能做到这一点? 我第一次(天真)的尝试导致了一个编译器错误: class GenericsTest(private var cs: T) { // dummy exists to ensure the method signatures are different constructor(cs: String, dummy: Int) : this(“a”) } IntelliJ强调”a”与消息: Type mismatch. Required: T Found: String 对我来说, String似乎是一个完全有效的T 我想明确指定types参数会有所帮助,但似乎不被允许。 这两种尝试都是不正确的语法: constructor(cs: String, dummy: Int) : this(“a”) constructor(cs: U, dummy: Int) : this(“a”) […]

等效的Java和Kotlin Stream代码之间意外的types差异

编辑2016年3月1日:公平的警告:这个问题被问到1.0.0之前的Kotlin。 从Kotlin 1.0.0开始,情况就不一样了。 请参阅下面的@Jayson Minard的Kotlin 1.0.0答案。 在使用Stream的Java 8代码中,我写了类似的东西 public static void main(String… args) { Stream integerStream = Stream.of(1,2,3); List integerList = integerStream.collect(Collectors.toList()); } 但是在Kotlin编写的类似代码中,我得到了意想不到的结果。 public fun main(args: Array) { val integerStream : Stream = Stream.of(1, 2, 3) // this is what I expect to write, like the Java 8 code, but is a compilation error: […]

标准的二进制maxBy函数

我概括了下面的代码: fun max(that: Type): Type = if (this.rank() < that.rank()) that else this 对此: fun max(that: Type): Type = maxBy(this, that) { it.rank() } fun maxBy<T, U : Comparable>(a: T, b: T, f: (T) -> U): T = if (f(a) < f(b)) b else a 在Kotlin的标准库中是否有像maxBy这样的函数? 我只能find一个数组。

如何从一个枚举类和kotlin中的一个字符串获取原始types的枚举值

我在java中有以下代码: Enum getEnumValue(Class enumClass, String value) { return Enum.valueOf((Class) enumClass, value); } 如何在Kotlin中重写? 更新 enumValueOf()函数不适用于这种情况,因为我不知道实际的types参数,我只有一个Class具有未知types的对象(kotlin中的Class )和一个名称字符串。 该类被称为枚举: Class.isEnum返回true。 使用这两个输入,上面的java代码可以获得原始types的枚举值。 这正是我所需要的,因为我对枚举的具体types不感兴趣。 但我无法弄清楚如何在kotlin中得到相同的结果。

在Scala 2.10中泛化的generics

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

generics协议,types为Swift

我如何创建一个协议variables。 我的目标是一个协议将有一个genericstypes的函数,我正在使用正在访问Class associatedtypetypes,该函数将返回genericstypes。 下面的示例声明: public protocol ComponentFactory { associatedtype T // A class and that class can be inherit from another so I need define generic type here func create() -> T } 我想为这个协议声明一个variables: fileprivate var mComponentFactoryMap = Dictionary() 在这一行,我收到一个错误: Protocol ‘ComponentFactory’ can only be used as a generic constraint because it has Self or […]

genericstypes和多态性

我有BaseFragment : public abstract class BaseFragment extends Fragment implements BaseMvpView { private BasePresenter presenter; protected void syncLifeCycle(BasePresenter presenter) { this.presenter = presenter; this.presenter.onCreate(); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //noinspection unchecked presenter.onAttachView(this); //it works with a warning } @Override public void onResume() { super.onResume(); presenter.onResume(); } @Override public void […]

当声明站点协变时,强制types参数在使用地点不变

我正在KProperty1上构建一个扩展函数。 即使KProperty1在types参数R是协变的,该函数也需要接受扩展属性( R )的值types的参数。 一个稍微人为的例子将是以下,虽然我的使用更合法。 data class Data(val value: String) fun KProperty1.setMagically(value: V) { this.javaField?.set(null, value) } fun test() { // I would like this to fail to compile Data::value.setMagically(190) } 似乎编译器推断出R的typesAny ,这是完全有效的,因为KProperty1 : KProperty1 我想要说的是,对于我的具体情况,我确实希望V是不变的。 我知道你可以使用out和in作为差异的宽度,但我无法弄清楚如何指定我想重写KProperty1上的协变注释,这种情况下是不变的。 值得注意的是,它与KMutableProperty1效果很好,因为它在R中是不变的。 但是我的代码也需要使用非可变属性。 对于上下文,我建立一些东西,生成数据库查询,这就是为什么我需要的价值是属性types的子类,即使我没有写入属性,但这个问题比我的具体,物业处理案件。

在这种情况下,神秘地转义try-catch块的例外最可能的原因是什么?

我在这样的Kotlin项目中使用Spring WebClient : data class DTO(val name: String) @Component class Runner: ApplicationRunner { override fun run(args: ApplicationArguments?) { try { val dto = get() } catch (e: Exception) { println(“ERROR, all exceptions should have been caught in ‘get’ “) } } } inline private fun get(): TResult? { var result: TResult? = null try { […]

如何从静态函数返回Template 时使用null来获取正确的types

我正在尝试一些Rx和Kotlin。 假设我有一个返回Observable的函数: public fun get():Observable { return if (someCondition()) { Observable.just(someLocalVarOfTypeT) } else { Observable.just(null) } } 编译器无法推断Observable.just(null)因为它在此expression式kotlin.Nothing替换为T : Type mismatch: required rx.Observable found rx.Observable 试图施放: Observable.just(null as T) 导致: The cast will never succeed Observable.just(null)的签名是(为了方便起见): public final static Observable just(final T value) { return … } 将这样一个Observable转换成正确types的正确方法是什么? 中间variables: val a: Observable = Observable.just(null) 作品,但看起来很奇怪…