Java的通配符类型参数 {? extends E} 表示此方法接受 E 或者 E 的 一些子类型对象的集合,而不只是 E 自身。这意味着我们可以安全地从其中(该集合中的 元素是 E 的子类的实例)读取 E ,但不能写入,因为我们不知道什么对象符合那个未知的 E 的子类型。反过来,该限制可以让 Collection 表示为 Collection extends Object> 的子类型。简而言之,带extends限定(上界)的通配符类型使得类型是协变的(covariant)。
在来看下面一段代码:
public void genericCode(){
//Java
List extends String> texts = new ArrayList<>();
texts.add("dd");//出错--不可写
String s = texts.get(0);//可读
List super String> spans = new ArrayList<>();
spans.add("ddddd");//可以写入
String s = spans.get(0);//出错--不可读
}
理解为什么这个技巧能够工作的关键相当简单:如果只能从集合中获取项目,那么使用String 的集合,并且从其中读取Object也没问题。反过来,如果只能向集合中放入项目,就可以用Object 集合并向其中放入 String :在 Java 中 List super String> 是 List 的一个超类。后者称为逆变性(contravariance)
但是在Kotlin中并没有通配符这种东西,但是它有:
声明处型变 (declaration-site variance)
类型投影 (type projections)
声明处型变
声明处的类型变异使用协变注解修饰符:in、out,消费者 in, 生产者 out。
使用 out 使得一个类型参数协变,协变类型参数只能用作输出,可以作为返回值类型但是无法作为入参的类型:
// 定义一个支持协变的类
class Runoob(val a: A) {
fun foo(): A {
return a
}
}
fun main(args: Array) {
var strCo: Runoob = Runoob("a")
var anyCo: Runoob = Runoob("b")
anyCo = strCo
println(anyCo.foo()) // 输出 a
}
in 使得一个类型参数逆变,逆变类型参数只能用作输入,可以作为入参的类型但是无法作为返回值的类型:
// 定义一个支持逆变的类
class Runoob(a: A) {
fun foo(a: A) {
}
}
fun main(args: Array) {
var strDCo = Runoob("a")
var anyDCo = Runoob("b")
strDCo = anyDCo
}
下面有两个与Java对照的实例,可以加深这种理解
//Kotlin
interface Source{
fun data():Source
}
class DataSource :Source{
val source :Source= ...
override fun data(): Source {
return source;
}
}
web.xml报错
The content of element type "web-app" must match "(icon?,display-
name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,s
JUnit4:Test文档中的解释:
The Test annotation supports two optional parameters.
The first, expected, declares that a test method should throw an exception.
If it doesn't throw an exception or if it
借鉴网上的思路,用java实现:
public class NoIfWhile {
/**
* @param args
*
* find x=1+2+3+....n
*/
public static void main(String[] args) {
int n=10;
int re=find(n);
System.o
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。
解决:
1)在windows下转换:
利用一些编辑器如UltraEdit或EditPlus等工具
Binary search tree works well for a wide variety of applications, but they have poor worst-case performance. Now we introduce a type of binary search tree where costs are guaranteed to be loga