我决定开始为Android编码。在做出决定之前,我花了很多时间来提高自己的Java技能,希望这对我进行Android开发也有帮助。
今天,在打开一些类(例如HashMap)之后,我看到Android实现不同于“常规”实现。
有人可以向我解释为什么与GUI和触摸无关的类需要在Android中以不同的方式实现吗?为什么不使用已经存在的同一个类?
我搜索了一个答案,但没有找到答案。如果已经问过这个问题,我将很高兴获得它的链接并锁定帖子。
我只是在我的程序中有一个错误,但我根本不明白该程序是如何编译的!
我有以下变量:
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类。那么为什么编译器没有阻止这个错误呢?我解决了这个问题,但我很清楚什么没有阻止代码被编译?
我是 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表达式一起使用?
希望在了解通用边界之后,我尝试了解通配符上限和下限。我的参考是: 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) 我正在寻找一个在类声明中使用out时可能导致问题的示例,并且该类有一个将参数类型作为参数的方法。
另外,我正在寻找一个在类声明中使用in且参数类型是类的var成员时可能导致问题的示例?我认为我只能通过例子来理解规则
我正在学习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)
也许我误会了什么?
我正在尝试将 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)
但我收到了不同的错误,例如:
我知道,如果我将省略(Int -> (Double)并只留下 b ,它会起作用:
aba = {b -> {x: Int -> 5 - 2 * b(x)} }
Run Code Online (Sandbox Code Playgroud)
但是为什么我不能显式地写参数呢?有人能告诉我是什么问题吗?
java ×4
kotlin ×4
generics ×2
android ×1
covariance ×1
dictionary ×1
enums ×1
jvm ×1
lambda ×1
sealed-class ×1
string ×1
type-erasure ×1