约束的泛型通配符?
Java中的泛型
xiaomi和byd都继承了car,但是只是这两个类是car的子类而已,而arraylist<xiaomi> ,arraylist<byd> 两个没有半毛钱继承关系
所以传入的参数整体,是car的list变形,里面的确都能存car,但不可以整体换成别的byd的list变形,只有list里的单独car对象可以装byd
这个时候可以用?通配符去接一切类型,但是这也不好,如果我搞了只狗的list,来这个方法里面跑步,非常不合适,所以就有了?的范围规定,必须是car的子类就是extends ,父类就是super
c#中的泛型
在 C# 中,虽然没有直接像 Java 那样的“泛型通配符”概念(例如 ? extends T
或 ? super T
),但 C# 提供了功能非常接近的机制,主要通过 泛型约束 和 协变与逆变 来实现类似的效果。
协变逆变
// 协变接口:T 可以是派生类 public interface ICovariant<out T> { T GetItem(); } // 逆变接口:T 可以是基类 public interface IContravariant<in T> { void SetItem(T item); }
ICovariant<object> obj = new Covariant<string>(); // string 是 object 的派生类 Console.WriteLine(obj.GetItem());
IContravariant<string> contravariant = new Contravariant<object>(); // object 是 string 的基类 contravariant.SetItem("Hello");
泛型约束
C# 还支持在泛型类型参数上应用约束来指定允许的类型,这提供了类似于 Java 中 ? extends T
的功能。
-
where T : class
:T 必须是引用类型。 -
where T : struct
:T 必须是值类型。 -
where T : SomeBaseClass
:T 必须继承自SomeBaseClass
。 -
where T : new()
:T 必须有无参构造函数。
public class MyClass<T> where T : Animal {
public void DoSomething(T item) {
// T 必须是 Animal 或其派生类
item.Speak();
}
}
SQL的update和delete
update
update的嵌套查询
select did from 部门表 where dname='要查的部的did,用这种方式得到';
update 要改的表 set 把数据进行修改 where did=(select 单个值的子表查询的使用)
再嵌入别的新表就OK了
同一张表不能同时又查又改,sql的保护机制
delete
和update 同样的同时对应一张表,不能乱来,要嵌套个子,让删和查不同时
还有,虚拟表要名字的
SQL的select虚拟表
虚拟表的拼接
group by 之后, select did 和 avg(salary)
虚拟表 的左连接
join 虚拟的select表,(要as,这样后面的on才有活路比较) on d.did=tmp.did;
Java异常
现在编译异常并不常用,sun公司也在全面高度禁止使用这种异常,因为会造成一些很麻烦的问题,所以要写异常的话,写运行异常就够了
这种没写分号之类的语法错误,不是所谓的异常,是脑子异常
joke,这里的看似的编译异常,不属于真正的异常,没有抛出,不是明显人为的异常提示
exception比较强烈,是直接抛出异常
编译时异常是担心你水平不行,而运行时异常就是直接的水平问题
两个异常就丢两次,外面要记得接住 ,或者再丢
又或者,只丢
这样就只要接一个异常exception就可以了
在这个函数后面加上throw异常类型,就可以不管这个异常,
这里的异常更在于提醒程序员容易出错,所以不是所有异常都代表真的出问题了
异常出现后,程序会立刻死掉
编译时不报错,运行报错
error一般程序员解决不了,硬件问题之类的基本上很难解决
固态硬盘和机械硬盘
固态硬盘(SSD)没有转盘或任何移动部件,所以不会像机械硬盘(HDD)那样在读取数据时有转动的声音或物理转动的部分。
- 机械硬盘(HDD)有转动的盘片,读取数据时会转起来。
- 固态硬盘(SSD)没有转盘,也没有任何移动部件,完全静音且不会转动。
“磁盘”这个词通常指的是那些会转动的存储介质,主要指传统的 机械硬盘(HDD)。机械硬盘内部有一个或多个磁盘片(也称为 盘片),这些盘片通过磁性存储数据,读取数据时需要旋转,并由机械臂进行读取。
SQL的子表查询
分解
查询结果
而之后要用这三个为子查询,筛选出逼这三个人工资都高的人
用的就是all(select.....),这样就是大于里面的所有的值
当然
还可以用max得出三个人里的最高工资,然后再作为子表查询,
这样也可以一个列值去比对多个子查询的结果,加any
拆解,查询 鞋机那和白露所在的部门中,存在于这两个部门的有哪些人
要是查不在同一个部门?加个not 在in前面
一个列名等于多个值,可以用in
这两个等价关系 (少了个逗号)
sql挑一个行去查询
同样是可以拆分的
用子select查询,然后gender可以直接等于,加上and,后面继续跟要查的数据,
这样就不用in,或者()
但还是优雅的好
首先同样属于子查询,只是在自己的一个表里,挑出一个行的几个数据,如果和这个挑出来的行的这几个数据相同,就筛选出来
用in也可以,两行
sql的子查询
分组查询,通过did的不同分为多个组,然后select后面就可以接分组的依据和聚合函数avg(salary)
然后一个很标准的子查询
把另一个不和组相关的用select()起来,在里面*的写
Java的游戏项目
越先创建的jlabel就越显示在上层
在Java中把图片打包
swing jframe
Some psychological feelings
when you hesitate,remember write for yourself ,without any restriction.even the language thing,even to be a silly man who talk like a crazyer,hold on yourself,when you want ,then to fit.
Writing **** is indeed a kind of exercise. Sometimes I feel that the original purpose is just to find a place to record what I have learned, and by the way, I can post it for you to see.
But in this process, it seems easy to get lost. The main problem is that I want to learn something. This seems very clear, but as the variables increase, it does become less clear.
I thought that as long as I could record it, it would be fine. But I have to say that people are indeed greedy. After discovering the benefits, if the initial goal is not firm enough, there is a possibility that they will be led away.
who cares,man.when you small,think highly is not a good solvation ,still to yourself ,see the next happening,record and help by the way,even you tell dirty words ,not that so many guys will spend time to see,it's really a truth that the earth won't stop rotate for your some ridiculous dumb article decisions.