小编Eit*_*s30的帖子

为什么Android的Java源代码实现与相同类的常规Java实现不同?

我决定开始为Android编码。在做出决定之前,我花了很多时间来提高自己的Java技能,希望这对我进行Android开发也有帮助。

今天,在打开一些类(例如HashMap)之后,我看到Android实现不同于“常规”实现。

有人可以向我解释为什么与GUI和触摸无关的类需要在Android中以不同的方式实现吗?为什么不使用已经存在的同一个类?

我搜索了一个答案,但没有找到答案。如果已经问过这个问题,我将很高兴获得它的链接并锁定帖子。

java implementation android

7
推荐指数
1
解决办法
96
查看次数

为什么“Map”类的“get”方法可以在没有编译错误的情况下发送不相关的键?

我只是在我的程序中有一个错误,但我根本不明白该程序是如何编译的!

我有以下变量:

gamesPerCountriesMap: MutableMap<Long, MutableMap<Long, MutableList<AllScoresGameObj>>>?
Run Code Online (Sandbox Code Playgroud)

我有以下代码行:

var gamesList = gamesPerCountriesMap?.get(countryItem.id)?.get(competitionItem)
Run Code Online (Sandbox Code Playgroud)

正确的行应该是:

var gamesList = gamesPerCountriesMap?.get(countryItem.id)?.get(competitionItem.id)
Run Code Online (Sandbox Code Playgroud)

我查看了 Map 类的原型,该方法声明如下:

公共内联运算符 fun <@kotlin.internal.OnlyInputTypes K, V> Map<out K, V>.get(key: K): V?

正如我们所看到的,它可以获取 K 并且它是子类型,但是作为 CompetitionObj 类的 instacne 的竞争项并没有继承Long类。那么为什么编译器没有阻止这个错误呢?我解决了这个问题,但我很清楚什么没有阻止代码被编译?

dictionary compiler-errors kotlin

6
推荐指数
1
解决办法
243
查看次数

Kotlin中的密封类和继承原理有什么区别?

我是 Kotlin 新手。我正在读一本书,其中显示了一个密封类作为枚举的“扩展”。我看不出他们之间有什么相似之处。在我看来,密封类与继承更相关,因为每个类都可以继承它并向其添加函数和属性例如:

sealed class messageType
class MessageSuccess (var msg: String) : MwssageType()
class MessageFailure (var msg: String, var e: Exeception) : MwssageType()
Run Code Online (Sandbox Code Playgroud)

我在这里看不到像Enum那样的,只有继承的问题。有人能解释一下我找不到的 Enum 和 Sealed 之间的想象是什么吗?也许它的威力在于将它与when表达式一起使用?

java enums kotlin sealed-class

4
推荐指数
1
解决办法
8569
查看次数

java 类型擦除如何处理 '?'

希望在了解通用边界之后,我尝试了解通配符上限和下限。我的参考是: https: //docs.oracle.com/javase/tutorial/java/generics/wildcards.html 我发现有一句话我能理解:“通配符可以在多种情况下使用:作为参数、字段或局部变量; “字段和局部变量?无法想象。为什么如此重要的来源不通过一个简单的例子来强调它?

我试图了解 java 编译器用哪个引用来替换(同时擦除)“?”。也许我有一个很大的误解,并且会发生任何删除(因此以下所有示例都不相关)。在下面的例子中: 1.

public static void funcA (List<? extends Number>l)
Run Code Online (Sandbox Code Playgroud)

2.

public static void funcB(List<? super Integer>l)
Run Code Online (Sandbox Code Playgroud)

第二个示例和以下代码之间有区别吗: 3.

public static <T extends Integer> funcC(List<? extends T>l)
Run Code Online (Sandbox Code Playgroud)

示例2与下面的示例是否有不同: 4.

public static <T extends Integer> void funcC(List<T>l)
Run Code Online (Sandbox Code Playgroud)

java generics type-erasure

3
推荐指数
1
解决办法
1916
查看次数

如果方法除了类型参数作为参数,为什么禁止在泛型中使用“out”关键字?

我正在寻找一个在类声明中使用out时可能导致问题的示例,并且该类有一个将参数类型作为参数的方法。

另外,我正在寻找一个在类声明中使用in且参数类型是类的var成员时可能导致问题的示例?我认为我只能通过例子来理解规则

generics covariance contravariance kotlin

3
推荐指数
1
解决办法
495
查看次数

无法理解Java字符串文字是如何实现的

我正在学习StringBuider类。我在该站点和许多其他书籍中已经读到,当编译器遇到文字的“ +”运算符时,它将自动使用StringBuilder append的方法来将它们连接起来。

这似乎有点问题,因为将在运行时创建StringBuilder对象,但是应该在编译时获取String引用的串联String对象的地址。

String s1 = "hello";  
String s2 ="bc"; 
int value = 22;
Run Code Online (Sandbox Code Playgroud)

当编译器“满足”此代码时:

String s = s1+s2+22;
Run Code Online (Sandbox Code Playgroud)

它将“更改”为:

String s = new StringBuilder().append("hello").append("bc").append(22).toString();
Run Code Online (Sandbox Code Playgroud)

也许我误会了什么?

java string stringbuilder jvm compiler-optimization

2
推荐指数
1
解决办法
126
查看次数

如何将 lambda 表达式分配给函数类型变量?

我正在尝试将 lambda 表达式分配给以下变量:

val aba : ((Int) -> Double) -> ((Int) -> Double)
Run Code Online (Sandbox Code Playgroud)

我试图的方式:

aba = {(b: (Int -> (Double))-> {x: Int  -> 5 - 2 * b(x)} }
Run Code Online (Sandbox Code Playgroud)

但我收到了不同的错误,例如:

  1. 期待逗号或“)”(来自编译器)
  2. 破坏类型 (int) 的声明初始值设定项 -> Double 必须有一个 component1() 函数(来自编辑器)

我知道,如果我将省略(Int -> (Double)并只留下 b ,它会起作用:

aba = {b  -> {x: Int  -> 5 - 2 * b(x)} }
Run Code Online (Sandbox Code Playgroud)

但是为什么我不能显式地写参数呢?有人能告诉我是什么问题吗?

lambda kotlin

2
推荐指数
1
解决办法
89
查看次数