From 09b355af399eb9a265b4c57d138e4569365866ef Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 09:30:07 +0200 Subject: [PATCH 01/25] String is an object --- settings.gradle | 1 - src/main/kotlin/ru/kotlin/homework/generics.kt | 9 +++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/ru/kotlin/homework/generics.kt diff --git a/settings.gradle b/settings.gradle index 1a97555..e9873b1 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1 @@ rootProject.name = 'Kotlin7' - diff --git a/src/main/kotlin/ru/kotlin/homework/generics.kt b/src/main/kotlin/ru/kotlin/homework/generics.kt new file mode 100644 index 0000000..28459c0 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/generics.kt @@ -0,0 +1,9 @@ +@file:Suppress("RedundantExplicitType") + +package ru.kotlin.homework + +fun main() { + val str: String = "Some string" + val obj: Any = str + println("String as object: $obj") +} \ No newline at end of file From 29634aeb0091118c8f4066840906cde2a85f81c5 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 09:33:22 +0200 Subject: [PATCH 02/25] String array is not an Object array --- src/main/kotlin/ru/kotlin/homework/generics.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/kotlin/ru/kotlin/homework/generics.kt b/src/main/kotlin/ru/kotlin/homework/generics.kt index 28459c0..37d29a9 100644 --- a/src/main/kotlin/ru/kotlin/homework/generics.kt +++ b/src/main/kotlin/ru/kotlin/homework/generics.kt @@ -5,5 +5,9 @@ package ru.kotlin.homework fun main() { val str: String = "Some string" val obj: Any = str + + val strArray: Array = arrayOf(str) + val objArray: Array = strArray + println("String as object: $obj") } \ No newline at end of file From 897538ddb3a68166b4cf544d41da5a00044ee271 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 09:34:59 +0200 Subject: [PATCH 03/25] String List is an Object list --- src/main/kotlin/ru/kotlin/homework/generics.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/generics.kt b/src/main/kotlin/ru/kotlin/homework/generics.kt index 37d29a9..31f369a 100644 --- a/src/main/kotlin/ru/kotlin/homework/generics.kt +++ b/src/main/kotlin/ru/kotlin/homework/generics.kt @@ -1,4 +1,4 @@ -@file:Suppress("RedundantExplicitType") +@file:Suppress("RedundantExplicitType", "UNUSED_VARIABLE") package ru.kotlin.homework @@ -6,8 +6,8 @@ fun main() { val str: String = "Some string" val obj: Any = str - val strArray: Array = arrayOf(str) - val objArray: Array = strArray + val strList: List = listOf(str) + val objList: List = strList - println("String as object: $obj") + println("List of objects: $objList") } \ No newline at end of file From 15203f3a09d09dbe2ab84fd67d53db24891a82b8 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 10:07:03 +0200 Subject: [PATCH 04/25] Color matcher --- src/main/kotlin/ru/kotlin/homework/Colors.kt | 6 ++++++ .../kotlin/ru/kotlin/homework/ShapeToColor.kt | 11 +++++++++++ src/main/kotlin/ru/kotlin/homework/Shapes.kt | 6 ++++++ .../kotlin/ru/kotlin/homework/generics.kt | 19 ++++++++++++------- 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 src/main/kotlin/ru/kotlin/homework/Colors.kt create mode 100644 src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt create mode 100644 src/main/kotlin/ru/kotlin/homework/Shapes.kt diff --git a/src/main/kotlin/ru/kotlin/homework/Colors.kt b/src/main/kotlin/ru/kotlin/homework/Colors.kt new file mode 100644 index 0000000..3ec6d39 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/Colors.kt @@ -0,0 +1,6 @@ +package ru.kotlin.homework + +abstract class Color + +data object Red : Color() +data object Blue : Color() \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt new file mode 100644 index 0000000..5057ab8 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt @@ -0,0 +1,11 @@ +package ru.kotlin.homework + +import java.lang.IllegalArgumentException + +open class ShapeToColor { + open fun process(shape: Shape): Color = when(shape) { + is Square -> Red + is Circle -> Blue + else -> throw IllegalArgumentException("Unknown shape") + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/Shapes.kt b/src/main/kotlin/ru/kotlin/homework/Shapes.kt new file mode 100644 index 0000000..505cdc9 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/Shapes.kt @@ -0,0 +1,6 @@ +package ru.kotlin.homework + +abstract class Shape + +data object Square: Shape() +data object Circle: Shape() \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/generics.kt b/src/main/kotlin/ru/kotlin/homework/generics.kt index 31f369a..10597df 100644 --- a/src/main/kotlin/ru/kotlin/homework/generics.kt +++ b/src/main/kotlin/ru/kotlin/homework/generics.kt @@ -1,13 +1,18 @@ -@file:Suppress("RedundantExplicitType", "UNUSED_VARIABLE") +@file:Suppress("RedundantExplicitType") package ru.kotlin.homework -fun main() { - val str: String = "Some string" - val obj: Any = str +import java.lang.IllegalArgumentException + +private val matcher: ShapeToColor = ShapeToColor() - val strList: List = listOf(str) - val objList: List = strList +fun main() { + println("Square: ${process(Square)}") + println("Circle: ${process(Circle)}") +} - println("List of objects: $objList") +fun process(shape: Shape) = when(matcher.process(shape)) { + Red -> "Красный" + Blue -> "Голубой" + else -> throw IllegalArgumentException("Неизвестный цвет") } \ No newline at end of file From d99aa8c2b9ab63e9ba2003481bdc4bece742a6eb Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 11:17:52 +0200 Subject: [PATCH 05/25] Narrow arguments --- src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt | 7 +++++++ src/main/kotlin/ru/kotlin/homework/generics.kt | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt index 5057ab8..1960514 100644 --- a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt +++ b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt @@ -8,4 +8,11 @@ open class ShapeToColor { is Circle -> Blue else -> throw IllegalArgumentException("Unknown shape") } +} + +class CircleToColor : ShapeToColor() { + override fun process(shape: Shape): Color = when(shape) { + is Circle -> Blue + else -> throw IllegalArgumentException("Unknown shape") + } } \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/generics.kt b/src/main/kotlin/ru/kotlin/homework/generics.kt index 10597df..1b5b5da 100644 --- a/src/main/kotlin/ru/kotlin/homework/generics.kt +++ b/src/main/kotlin/ru/kotlin/homework/generics.kt @@ -4,7 +4,7 @@ package ru.kotlin.homework import java.lang.IllegalArgumentException -private val matcher: ShapeToColor = ShapeToColor() +private val matcher: ShapeToColor = CircleToColor() fun main() { println("Square: ${process(Square)}") From a5aa6b5703f1deb91d8de7d6b8232b12bd37d29c Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 11:26:11 +0200 Subject: [PATCH 06/25] Expand arguments --- src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt | 9 +++++++++ src/main/kotlin/ru/kotlin/homework/Shapes.kt | 3 ++- src/main/kotlin/ru/kotlin/homework/generics.kt | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt index 1960514..f08f459 100644 --- a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt +++ b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt @@ -1,3 +1,5 @@ +@file:Suppress("unused") + package ru.kotlin.homework import java.lang.IllegalArgumentException @@ -15,4 +17,11 @@ class CircleToColor : ShapeToColor() { is Circle -> Blue else -> throw IllegalArgumentException("Unknown shape") } +} + +class NewShapeToColor : ShapeToColor() { + override fun process(shape: Shape): Color = when(shape) { + is Triangle -> Blue + else -> super.process(shape) + } } \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/Shapes.kt b/src/main/kotlin/ru/kotlin/homework/Shapes.kt index 505cdc9..a8459bc 100644 --- a/src/main/kotlin/ru/kotlin/homework/Shapes.kt +++ b/src/main/kotlin/ru/kotlin/homework/Shapes.kt @@ -3,4 +3,5 @@ package ru.kotlin.homework abstract class Shape data object Square: Shape() -data object Circle: Shape() \ No newline at end of file +data object Circle: Shape() +data object Triangle: Shape() \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/generics.kt b/src/main/kotlin/ru/kotlin/homework/generics.kt index 1b5b5da..526967b 100644 --- a/src/main/kotlin/ru/kotlin/homework/generics.kt +++ b/src/main/kotlin/ru/kotlin/homework/generics.kt @@ -4,7 +4,7 @@ package ru.kotlin.homework import java.lang.IllegalArgumentException -private val matcher: ShapeToColor = CircleToColor() +private val matcher: ShapeToColor = NewShapeToColor() fun main() { println("Square: ${process(Square)}") From d4ec53b2bc8058039d80c8b2aa9d6d395bd05e39 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 11:49:30 +0200 Subject: [PATCH 07/25] Expand return values --- src/main/kotlin/ru/kotlin/homework/Colors.kt | 3 ++- src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt | 8 ++++++++ src/main/kotlin/ru/kotlin/homework/generics.kt | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/Colors.kt b/src/main/kotlin/ru/kotlin/homework/Colors.kt index 3ec6d39..6556466 100644 --- a/src/main/kotlin/ru/kotlin/homework/Colors.kt +++ b/src/main/kotlin/ru/kotlin/homework/Colors.kt @@ -3,4 +3,5 @@ package ru.kotlin.homework abstract class Color data object Red : Color() -data object Blue : Color() \ No newline at end of file +data object Blue : Color() +data object Green : Color() \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt index f08f459..148848c 100644 --- a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt +++ b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt @@ -24,4 +24,12 @@ class NewShapeToColor : ShapeToColor() { is Triangle -> Blue else -> super.process(shape) } +} + +class NewColors : ShapeToColor() { + override fun process(shape: Shape): Color = when(shape) { + is Triangle -> Blue + is Square -> Green + else -> super.process(shape) + } } \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/generics.kt b/src/main/kotlin/ru/kotlin/homework/generics.kt index 526967b..a3d59a8 100644 --- a/src/main/kotlin/ru/kotlin/homework/generics.kt +++ b/src/main/kotlin/ru/kotlin/homework/generics.kt @@ -4,7 +4,7 @@ package ru.kotlin.homework import java.lang.IllegalArgumentException -private val matcher: ShapeToColor = NewShapeToColor() +private val matcher: ShapeToColor = NewColors() fun main() { println("Square: ${process(Square)}") From 208743151923544375e7dbc0127d65a2c241b434 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 12:01:59 +0200 Subject: [PATCH 08/25] Narrow return values --- src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt | 4 ++++ src/main/kotlin/ru/kotlin/homework/generics.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt index 148848c..516e346 100644 --- a/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt +++ b/src/main/kotlin/ru/kotlin/homework/ShapeToColor.kt @@ -32,4 +32,8 @@ class NewColors : ShapeToColor() { is Square -> Green else -> super.process(shape) } +} + +class AllInRed : ShapeToColor() { + override fun process(shape: Shape): Color = Red } \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/generics.kt b/src/main/kotlin/ru/kotlin/homework/generics.kt index a3d59a8..ed80015 100644 --- a/src/main/kotlin/ru/kotlin/homework/generics.kt +++ b/src/main/kotlin/ru/kotlin/homework/generics.kt @@ -4,7 +4,7 @@ package ru.kotlin.homework import java.lang.IllegalArgumentException -private val matcher: ShapeToColor = NewColors() +private val matcher: ShapeToColor = AllInRed() fun main() { println("Square: ${process(Square)}") From 6ab8a1c4fd8701a25d694fead60e99e1188f445b Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 12:52:12 +0200 Subject: [PATCH 09/25] Contrvariance in Kotlin not allowed --- .../kotlin/homework/contrvarianceInKotlin.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/kotlin/ru/kotlin/homework/contrvarianceInKotlin.kt diff --git a/src/main/kotlin/ru/kotlin/homework/contrvarianceInKotlin.kt b/src/main/kotlin/ru/kotlin/homework/contrvarianceInKotlin.kt new file mode 100644 index 0000000..6925540 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/contrvarianceInKotlin.kt @@ -0,0 +1,18 @@ +package ru.kotlin.homework + +fun main() { + val processor: ToExtendCircle = ToExtendCircle() + processor.process(Circle) +} + +open class ToExtendCircle { + open fun process(value: Circle) { + println(value) + } +} + +class ToExtendAny : ToExtendCircle() { + override fun process(value: Shape) { + + } +} \ No newline at end of file From 7227a067c6e1d23ebfa486bfdbd53c2a1f1362b7 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 13:24:28 +0200 Subject: [PATCH 10/25] Contrvariance with overloading --- .../ru/kotlin/homework/contrvarianceInKotlin.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/contrvarianceInKotlin.kt b/src/main/kotlin/ru/kotlin/homework/contrvarianceInKotlin.kt index 6925540..1588223 100644 --- a/src/main/kotlin/ru/kotlin/homework/contrvarianceInKotlin.kt +++ b/src/main/kotlin/ru/kotlin/homework/contrvarianceInKotlin.kt @@ -1,8 +1,11 @@ package ru.kotlin.homework fun main() { - val processor: ToExtendCircle = ToExtendCircle() + val processor: ToExtendCircle = ToExtendShape() processor.process(Circle) + + val shapeProcessor: ToExtendShape = processor as ToExtendShape + shapeProcessor.process(Square) } open class ToExtendCircle { @@ -11,8 +14,9 @@ open class ToExtendCircle { } } -class ToExtendAny : ToExtendCircle() { - override fun process(value: Shape) { - +class ToExtendShape : ToExtendCircle() { + fun process(value: Shape) = when(value) { + is Circle -> super.process(value) + else -> println("Any: $value") } } \ No newline at end of file From 4935d07cc422aac70829656ecf9ccb12cc3ec568 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 13:35:25 +0200 Subject: [PATCH 11/25] Covariance --- .../ru/kotlin/homework/coVarianceInKotlin.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/kotlin/ru/kotlin/homework/coVarianceInKotlin.kt diff --git a/src/main/kotlin/ru/kotlin/homework/coVarianceInKotlin.kt b/src/main/kotlin/ru/kotlin/homework/coVarianceInKotlin.kt new file mode 100644 index 0000000..2e908a6 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/coVarianceInKotlin.kt @@ -0,0 +1,19 @@ +package ru.kotlin.homework + + +fun main() { + val producer: ShapeProducer = CircleProducer() + println(producer.produce()) +} + +open class ShapeProducer { + open fun produce(): Shape { + return Square + } +} + +class CircleProducer : ShapeProducer() { + override fun produce(): Circle { + return Circle + } +} \ No newline at end of file From 3abe99b5101fe49cdc9ce1744ee253881b1404a3 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 14:36:16 +0200 Subject: [PATCH 12/25] Invariant --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/kotlin/ru/kotlin/homework/inOut.kt diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt new file mode 100644 index 0000000..0036678 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -0,0 +1,19 @@ +package ru.kotlin.homework + + +fun main() { + val circleGroup = Group() + circleGroup.insert(Circle) + val fromGroup = circleGroup.fetch() + println("From group: $fromGroup") +} + +open class Group { + private val items: MutableList = mutableListOf() + fun insert(item: T) { + items.add(item) + } + fun fetch(): T { + return items.last() + } +} \ No newline at end of file From fc7a5b7d029d18682ed4a821f4a39c65d29cbe30 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 16:52:11 +0200 Subject: [PATCH 13/25] Circle group is not a Shape group --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index 0036678..68acc6f 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -6,6 +6,10 @@ fun main() { circleGroup.insert(Circle) val fromGroup = circleGroup.fetch() println("From group: $fromGroup") + + val shapeGroup: Group = circleGroup + val fromShapeGroup: Shape = shapeGroup.fetch() + println("From shape group: $fromShapeGroup") } open class Group { From f748ca47807889461dca410b828c3c4e6038aa36 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 16:53:57 +0200 Subject: [PATCH 14/25] Covariant read group --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index 68acc6f..262327b 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -7,17 +7,21 @@ fun main() { val fromGroup = circleGroup.fetch() println("From group: $fromGroup") - val shapeGroup: Group = circleGroup - val fromShapeGroup: Shape = shapeGroup.fetch() - println("From shape group: $fromShapeGroup") + val readGroup: ReadGroup = circleGroup + val fromReadGroup: Shape = readGroup.fetch() + println("From read group: $fromReadGroup") } -open class Group { +interface ReadGroup { + fun fetch(): T +} + +open class Group : ReadGroup { private val items: MutableList = mutableListOf() fun insert(item: T) { items.add(item) } - fun fetch(): T { + override fun fetch(): T { return items.last() } } \ No newline at end of file From ccf543765cb512544125bcb49101071cbe9fa820 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Wed, 25 Oct 2023 17:03:44 +0200 Subject: [PATCH 15/25] Contrvariant write group --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index 262327b..f6f5c91 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -10,15 +10,28 @@ fun main() { val readGroup: ReadGroup = circleGroup val fromReadGroup: Shape = readGroup.fetch() println("From read group: $fromReadGroup") + + val shapeGroup = Group() + val writeCircleGroup: WriteGroup = shapeGroup + writeCircleGroup.insert(Circle) + val writeTriangleGroup: WriteGroup = shapeGroup + writeTriangleGroup.insert(Triangle) + + val fromShapeGroup: Shape = shapeGroup.fetch() + println("From shape group: $fromShapeGroup") } interface ReadGroup { fun fetch(): T } -open class Group : ReadGroup { +interface WriteGroup { + fun insert(item: T) +} + +open class Group : ReadGroup, WriteGroup { private val items: MutableList = mutableListOf() - fun insert(item: T) { + override fun insert(item: T) { items.add(item) } override fun fetch(): T { From adf798155766c3f8149488045dec8d4398fda830 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Thu, 26 Oct 2023 14:07:07 +0200 Subject: [PATCH 16/25] Declaration site variance --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index f6f5c91..0afeaae 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -7,34 +7,26 @@ fun main() { val fromGroup = circleGroup.fetch() println("From group: $fromGroup") - val readGroup: ReadGroup = circleGroup + val readGroup: Group = circleGroup val fromReadGroup: Shape = readGroup.fetch() println("From read group: $fromReadGroup") val shapeGroup = Group() - val writeCircleGroup: WriteGroup = shapeGroup + val writeCircleGroup: Group = shapeGroup writeCircleGroup.insert(Circle) - val writeTriangleGroup: WriteGroup = shapeGroup + val writeTriangleGroup: Group = shapeGroup writeTriangleGroup.insert(Triangle) val fromShapeGroup: Shape = shapeGroup.fetch() println("From shape group: $fromShapeGroup") } -interface ReadGroup { - fun fetch(): T -} - -interface WriteGroup { - fun insert(item: T) -} - -open class Group : ReadGroup, WriteGroup { +open class Group { private val items: MutableList = mutableListOf() - override fun insert(item: T) { + fun insert(item: T) { items.add(item) } - override fun fetch(): T { + fun fetch(): T { return items.last() } } \ No newline at end of file From 55b58d80dc52f9ed198c017ab10698b404dee247 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Thu, 26 Oct 2023 15:31:36 +0200 Subject: [PATCH 17/25] Declaration site variance with functions --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index 0afeaae..249bae9 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -10,12 +10,14 @@ fun main() { val readGroup: Group = circleGroup val fromReadGroup: Shape = readGroup.fetch() println("From read group: $fromReadGroup") + fetcher(circleGroup) val shapeGroup = Group() val writeCircleGroup: Group = shapeGroup writeCircleGroup.insert(Circle) val writeTriangleGroup: Group = shapeGroup writeTriangleGroup.insert(Triangle) + putter(shapeGroup, Circle) val fromShapeGroup: Shape = shapeGroup.fetch() println("From shape group: $fromShapeGroup") @@ -29,4 +31,12 @@ open class Group { fun fetch(): T { return items.last() } +} + +fun fetcher(group: Group) { + val fetched = group.fetch() + println(fetched) +} +fun putter(group: Group, item: Circle) { + group.insert(item) } \ No newline at end of file From 7ce3fc5ed18c359b6eb85508e74a8ed8bb7b78da Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Thu, 26 Oct 2023 15:50:59 +0200 Subject: [PATCH 18/25] Star projection --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index 249bae9..03eec4c 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -21,10 +21,17 @@ fun main() { val fromShapeGroup: Shape = shapeGroup.fetch() println("From shape group: $fromShapeGroup") + + println(measure(circleGroup)) + println(measure(readGroup)) + println(measure(shapeGroup)) } open class Group { private val items: MutableList = mutableListOf() + + fun getSize(): Int = items.size + fun insert(item: T) { items.add(item) } @@ -39,4 +46,7 @@ fun fetcher(group: Group) { } fun putter(group: Group, item: Circle) { group.insert(item) +} +fun measure(group: Group<*>) { + println("Size of group: ${group.getSize()}") } \ No newline at end of file From 8db13b04d141ca3e92ad1d5fd7859bfc665aad7f Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Thu, 26 Oct 2023 15:57:01 +0200 Subject: [PATCH 19/25] Star projection (explicit) --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index 03eec4c..c76fab1 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -22,9 +22,12 @@ fun main() { val fromShapeGroup: Shape = shapeGroup.fetch() println("From shape group: $fromShapeGroup") - println(measure(circleGroup)) - println(measure(readGroup)) - println(measure(shapeGroup)) + var anyGroup: Group<*> = circleGroup + println(measure(anyGroup)) + anyGroup = readGroup + println(measure(anyGroup)) + anyGroup = shapeGroup + println(measure(anyGroup)) } open class Group { From 68023c570cfed493c9214d3f8ac7dcffb21b70c9 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Thu, 26 Oct 2023 19:13:25 +0200 Subject: [PATCH 20/25] Star projection: fetched is Any? --- src/main/kotlin/ru/kotlin/homework/Shapes.kt | 6 +++++- src/main/kotlin/ru/kotlin/homework/inOut.kt | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ru/kotlin/homework/Shapes.kt b/src/main/kotlin/ru/kotlin/homework/Shapes.kt index a8459bc..0d95ddb 100644 --- a/src/main/kotlin/ru/kotlin/homework/Shapes.kt +++ b/src/main/kotlin/ru/kotlin/homework/Shapes.kt @@ -1,6 +1,10 @@ package ru.kotlin.homework -abstract class Shape +import kotlin.random.Random + +abstract class Shape { + val id: Int = Random.nextInt() +} data object Square: Shape() data object Circle: Shape() diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index c76fab1..fe4ffc8 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -28,6 +28,8 @@ fun main() { println(measure(anyGroup)) anyGroup = shapeGroup println(measure(anyGroup)) + + idOfFetched(anyGroup) } open class Group { @@ -52,4 +54,8 @@ fun putter(group: Group, item: Circle) { } fun measure(group: Group<*>) { println("Size of group: ${group.getSize()}") +} +fun idOfFetched(group: Group<*>) { + val fetched: Any? = group.fetch() + println("No ID on fetched") } \ No newline at end of file From 837433445a014799af18cb1edcea57e4ca8ac513 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Thu, 26 Oct 2023 19:14:20 +0200 Subject: [PATCH 21/25] Star projection on bound generic: fetched is Shape --- src/main/kotlin/ru/kotlin/homework/inOut.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/inOut.kt b/src/main/kotlin/ru/kotlin/homework/inOut.kt index fe4ffc8..b60b5b2 100644 --- a/src/main/kotlin/ru/kotlin/homework/inOut.kt +++ b/src/main/kotlin/ru/kotlin/homework/inOut.kt @@ -32,7 +32,7 @@ fun main() { idOfFetched(anyGroup) } -open class Group { +open class Group { private val items: MutableList = mutableListOf() fun getSize(): Int = items.size @@ -56,6 +56,6 @@ fun measure(group: Group<*>) { println("Size of group: ${group.getSize()}") } fun idOfFetched(group: Group<*>) { - val fetched: Any? = group.fetch() - println("No ID on fetched") + val fetched: Shape = group.fetch() + println("Id of fetched: ${fetched.id}") } \ No newline at end of file From 35ff416aa43cc253e48ab3296edfc49e29a2290d Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Thu, 26 Oct 2023 20:32:07 +0200 Subject: [PATCH 22/25] Home work --- README.md | 24 +++++++ .../kotlin/homework/network/NetworkLogger.kt | 64 +++++++++++++++++++ .../homework/network/NetworkResponse.kt | 45 +++++++++++++ 3 files changed, 133 insertions(+) create mode 100644 src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt create mode 100644 src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt diff --git a/README.md b/README.md index c7da4e3..4c3dbb1 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,26 @@ # Kotlin-7 - Generics Код к занятию Kotlin-7 - Generics + +## Домашнее задание +В папке [network](src/main/kotlin/ru/kotlin/homework/network) находится прототип класса +результата работы сетевого сервиса `NetworkResponse`, который может быть: + +- `Success` - для удачного результата +- `Failure` - для ошибки + +### Задание 1. +Исправьте определение классов так, чтобы все присваивания под определениями компилировались +без ошибок. Подсказки: + +- Используйте declaration type variance +- Мы только ВОЗВРАЩАЕМ результат или ошибку (ковариантность по обоим параметрам) +- Вспоминаем, что тип Nothing - это подтип любого другого типа + +### Задание 2. +Почините (правильно расставьте variance параметров) класс [NetworkLogger](src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt) +таким образом, чтобы **один** универсальный экземпляр логгера можно было использовать для логирования любых ошибок: + +- `processThrowables` принимает `ErrorLogger` +- `processApiErrors` принимает `ErrorLogger` + +Приступайте ко второму заданию только после окончания работы над первым! \ No newline at end of file diff --git a/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt b/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt new file mode 100644 index 0000000..a5f33c5 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt @@ -0,0 +1,64 @@ +@file:Suppress("unused") + +package ru.kotlin.homework.network + +import ru.kotlin.homework.Circle +import java.lang.IllegalArgumentException +import java.time.LocalDateTime + +/** + * Известный вам список ошибок + */ +sealed class ApiException(message: String) : Throwable(message) { + data object NotAuthorized : ApiException("Not authorized") + data object NetworkException : ApiException("Not connected") + data object UnknownException: ApiException("Unknown exception") +} + +class ErrorLogger { + + val errors = mutableListOf>() + + fun log(response: NetworkResponse<*, E>) { + if (response is Failure) { + errors.add(response.responseDateTime to response.error) + } + } + + fun dumpLog() { + errors.forEach { (date, error) -> + println("Error at $date: ${error.message}") + } + } +} + +fun processThrowables(logger: ErrorLogger) { + logger.log(Success("Success")) + Thread.sleep(100) + logger.log(Success(Circle)) + Thread.sleep(100) + logger.log(Failure(IllegalArgumentException("Something unexpected"))) + + logger.dumpLog() +} + +fun processApiErrors(apiExceptionLogger: ErrorLogger) { + apiExceptionLogger.log(Success("Success")) + Thread.sleep(100) + apiExceptionLogger.log(Success(Circle)) + Thread.sleep(100) + apiExceptionLogger.log(Failure(ApiException.NetworkException)) + + apiExceptionLogger.dumpLog() +} + +fun main() { + val logger = ErrorLogger() + + println("Processing Throwable:") + processThrowables(logger) + + println("Processing Api:") + processApiErrors(logger) +} + diff --git a/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt b/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt new file mode 100644 index 0000000..3018c40 --- /dev/null +++ b/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt @@ -0,0 +1,45 @@ +@file:Suppress("unused") + +package ru.kotlin.homework.network + +import java.lang.Exception +import java.lang.IllegalArgumentException +import java.time.LocalDateTime + +/** + * Network result + */ +sealed class NetworkResponse { + val responseDateTime: LocalDateTime = LocalDateTime.now() +} + +/** + * Network success + */ +data class Success(val resp: T): NetworkResponse() + +/** + * Network error + */ +data class Failure(val error: R): NetworkResponse() + +val s1 = Success("Message") +val r11: NetworkResponse = s1 +val r12: NetworkResponse = s1 + +val s2 = Success("Message") +val r21: NetworkResponse = s2 +val r22: NetworkResponse = s2 + +val s3 = Success(String()) +val r31: Success = s3 +val r32: Success = s3 + +val e = Failure(Error()) +val er1: NetworkResponse = e +val er2: NetworkResponse = e +val er4: NetworkResponse = e + +val er5: NetworkResponse = Failure(IllegalArgumentException("message")) + +val message = e.error.message \ No newline at end of file From 99e8d1dfddbd8c34678a5b6446ebcd1626670d81 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Fri, 27 Oct 2023 12:07:49 +0200 Subject: [PATCH 23/25] Check action --- .github/workflows/check.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/check.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..9cffaf9 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,32 @@ +name: Check + +on: + pull_request: + types: [assigned, opened, synchronize, reopened] + +jobs: + checks: + name: Checks + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: set up JDK 17 + uses: actions/setup-java@v1 + with: + java-version: 17 + - name: Cache + uses: actions/cache@v2 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + ~/.m2 + ~/.android/build-cache + key: ${GITHUB_REF##*/} + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Check with gradle + run: ./gradlew build From a78143c5418f2e82bdcd52bf1163e0956e876b96 Mon Sep 17 00:00:00 2001 From: Nikolay Kochetkov Date: Fri, 27 Oct 2023 14:51:25 +0200 Subject: [PATCH 24/25] Additional homework --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4c3dbb1..d7a41ad 100644 --- a/README.md +++ b/README.md @@ -23,4 +23,11 @@ - `processThrowables` принимает `ErrorLogger` - `processApiErrors` принимает `ErrorLogger` -Приступайте ко второму заданию только после окончания работы над первым! \ No newline at end of file +Приступайте ко второму заданию только после окончания работы над первым! + +### Задание 3 (со звездочкой) +Сделайте так, чтобы [NetworkLogger](src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt) имел возможность выдать список +накопленных ошибок. Настройте типы таким образом, чтобы при сохранении условий заданий 1 и 2, в классе появилась функция: +```kotlin +fun dump(): List> +``` \ No newline at end of file From 7872da92fa88f7fdacd7a28dcb1e718c0dc5b942 Mon Sep 17 00:00:00 2001 From: PavelSkobeev Date: Tue, 4 Jun 2024 14:08:17 +0300 Subject: [PATCH 25/25] =?UTF-8?q?=D1=87=D1=82=D0=BE-=D1=82=D0=BE=20=D1=81?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt | 4 ++-- .../kotlin/ru/kotlin/homework/network/NetworkResponse.kt | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt b/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt index a5f33c5..a997a09 100644 --- a/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt +++ b/src/main/kotlin/ru/kotlin/homework/network/NetworkLogger.kt @@ -32,7 +32,7 @@ class ErrorLogger { } } -fun processThrowables(logger: ErrorLogger) { +fun processThrowables(logger: ErrorLogger) { logger.log(Success("Success")) Thread.sleep(100) logger.log(Success(Circle)) @@ -42,7 +42,7 @@ fun processThrowables(logger: ErrorLogger) { logger.dumpLog() } -fun processApiErrors(apiExceptionLogger: ErrorLogger) { +fun processApiErrors(apiExceptionLogger: ErrorLogger) { apiExceptionLogger.log(Success("Success")) Thread.sleep(100) apiExceptionLogger.log(Success(Circle)) diff --git a/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt b/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt index 3018c40..f35dbc2 100644 --- a/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt +++ b/src/main/kotlin/ru/kotlin/homework/network/NetworkResponse.kt @@ -9,19 +9,19 @@ import java.time.LocalDateTime /** * Network result */ -sealed class NetworkResponse { +sealed class NetworkResponse { val responseDateTime: LocalDateTime = LocalDateTime.now() } /** * Network success */ -data class Success(val resp: T): NetworkResponse() +data class Success(val resp: T): NetworkResponse() /** * Network error */ -data class Failure(val error: R): NetworkResponse() +data class Failure(val error: R): NetworkResponse() val s1 = Success("Message") val r11: NetworkResponse = s1