Skip to content

Instantly share code, notes, and snippets.

View erokhins's full-sized avatar

Stanislav Erokhin erokhins

  • JetBrains
  • Amsterdam
View GitHub Profile
@erokhins
erokhins / fine-grained-variance-check.md
Created May 2, 2018 17:55 — forked from mekarthedev/fine-grained-variance-check.md
Kotlin proposal: Allow `out` type parameter to occur in `in` position

Allow out type parameter to safely occur in in position

  • Type: Design proposal
  • Author: Viacheslav Makarov
  • Status: Draft

Summary

Reduce the need in @UnsafeVariance. Allow covariant types to have non-private methods with non-covariant signature. To protect class' covariance, out-project signatures

// FILE: 1.kt
package p3
class A {
fun<T> inTransaction(block: (tran: String) -> T): T {
println("Function 1")
return block("")
}
fun inTransaction(block: (tran: String) -> Unit) {
// FILE: 1.kt
package p3
class A {
fun <T> test(a: List<T>): Int {
println("Function 1")
return 1
}
fun test(b: List<Int>) {
println("Function 2")

Code fragment:

fun test() = 1 // comment

Kotlin code fragment:

fun test2() = 2 // comment
fun bar(s: List<String>) {}
fun test() {
bar(listOf().filter { false })
}
\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
\inputencoding{utf8}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{amssymb}
\newcommand{\Expect}{\mathbb E}
\newcommand{\PRob}{\mathbb P}
trait Inv<T> {
var t: T
}
fun <T> some(t: Inv<T>): Inv<Inv<T>> {
return object : Inv<Inv<T>> {
override var t: Inv<T>
get() = t
set(value: Inv<T>) {
t.t = value.t
public class Test {
private static class A {
private int bar;
private A() {
bar = 3;
System.out.println(getBar());
}
public int getBar() {
return bar;
open class A {
open val bar: Int
{
bar = 3
println(bar)
}
}
class B : A() {
override val bar = 4
open class A() {
open fun bar(t: Int = 1) = t
}
class B: A() {
override fun bar(t: Int): Int {
return super.bar()
}
}