public class GeniricClassDemo {
public static void main(String[] args) {
Person<String> p = new Person<>();
p.setData("今天也一定要努力");
p.say();
}
}
/**
* 泛型类
*/
class Person<A>{
private String name;
private int age;
private A data;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public A getData() {
return data;
}
public void setData(A data) {
this.data = data;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", data=" + data +
'}';
}
public void say(){
System.out.println(data);
}
}
/**
* 泛型接口
*/
public interface GenericInterface<T> {
T setData(T t);
}
/**
* 实现类
*/
public class GenericInterfaceDemo {
public static void main(String[] args) {
//1、调用指定数据类型的泛型接口类;
GeneticInterface01 text01 = new GeneticInterface01();
text01.setData("今天是个好日子");
//2、调用泛型继承类
GenericInterface02<String> text02 = new GenericInterface02<>();
text02.setData("我今天也很努力呀");
}
}
//指定数据类型
class GeneticInterface01 implements GenericInterface<String> {
private String text;
@Override
public String setData(String text) {
System.out.println(text);
return text;
}
}
//不指定数据类型
class GenericInterface02<T> implements GenericInterface<T> {
private T data;
@Override
public T setData(T data) {
System.out.println(data);
return data;
}
}
public class GenericMethodDemo {
public static void main(String[] args) {
haha("明天会下雨");
}
public static <A> void haha(A a){
System.out.println(a);
}
}
<T extends 类或接口1 & 接口2>
<? extends Parent> //指定了泛型类型的上届
<? super Child> //指定了泛型类型的下届
<?> //指定了没有限制的泛型类型
例子:
public class GenericMethodDemo {
public static void main(String[] args) {
//创建的对象必须是Fruit的子类
Plate<? extends Fruit> p = new Plate<Apple>();
//创建的对象必须是Apple的父类
Plate<? super Apple> m = new Plate<Fruit>();
}
}
interface Fruit {
}
class Apple implements Fruit {
}
class Plate<T> {
T data;
}
变量和类型 | 方法 | 描述 |
---|---|---|
static int | checkFromIndexSize(int fromIndex, int size, int length) | 检查是否在子范围从 fromIndex (包括)到 fromIndex + size (不包括)是范围界限内 0 (包括)到 length (不包括)。 |
static int | checkFromToIndex(int fromIndex, int toIndex, int length) | 检查是否在子范围从 fromIndex (包括)到 toIndex (不包括)是范围界限内 0 (包括)到 length (不包括)。 |
static int | checkIndex(int index, int length) | 检查 index是否在 0 (含)到 length (不包括)范围内。 |
static < T > int | compare(T a, T b, Comparator<? super T> c) | 如果参数相同则返回0,否则返回 c.compare(a, b) 。 |
static boolean | deepEquals(Object a, Object b) | 返回 true如果参数是深层相等,彼此 false其他。 |
static boolean | equals(Object a, Object b) | 返回 true如果参数相等,彼此 false其他。 |
static int | hash(Object… values) | 为一系列输入值生成哈希码。 |
static int | hashCode(Object o) | 返回非的哈希码 null参数,0为 null的论点。 |
static boolean | isNull(Object obj) | 返回 true如果提供的参考是 null ,否则返回 false 。 |
static boolean | nonNull(Object obj) | 返回 true如果提供的参考是非 null否则返回 false 。 |
static < T > T | requireNonNull(T obj) | 检查指定的对象引用是否不是 null 。 |
static < T > T | requireNonNull(T obj, String message) | 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。 |
static < T > T | requireNonNull(T obj, Supplier< String > messageSupplier) | 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。 |
static < T > T | requireNonNullElse(T obj, T defaultObj) | 如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。 |
static < T > T | requireNonNullElseGet(T obj, Supplier<? extends T> supplier) | 如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。 |
static String | toString(Object o) | 返回调用的结果 toString对于非 null参数, "null"为 null的说法。 |
static String | toString(Object o, String nullDefault) | 如果第一个参数不是 null ,则返回在第一个参数上调用 toString的结果,否则返回第二个参数。 |
官方的描述文档是这样写的,那应该怎样去使用这些方法呢?举个例子:
public static void main(String[] args) {
String p = null;
System.out.println(Objects.requireNonNull(p));
}
上面这段小程序我们调用的是 requireNonNull(T obj, String message) 这个方法,如果我们的 p 为空的话,就会返回指定的异常;如果不为空的话,就会返回 p 的值。其他的方法也可以这样调用,当然,有什么需求,我们就怎么调用。
例如,我们还可以这样玩:
public class ObjectsDemo01 {
public static void main(String[] args) {
Person p = new Person();
p.setName(null);
String result = Objects.requireNonNull(p.getName());
System.out.println(result);
}
}
class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class MathDemo01 {
public static void main(String[] args) {
int x = 10;
int y = 2;
int m = Math.multiplyExact(x,y);
System.out.println(m);
}
}
毫无疑问,上面输出的结果是20(这种难度的题,我一般口算都算不出来,基本都是借助计算器~)。好啦,这个方法就暂时这样吧,看看下一个难题…
public class ArraysDemo01 {
public static void main(String[] args) {
int[] arr1 = {
9,1,2,3,4,5,6,7,8};
System.out.println(Arrays.toString(arr1)); //打印数组内容
Arrays.sort(arr1); //排序
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.binarySearch(arr1,6)); // 查找数组中的数据
//数组的动态扩容
System.out.println(arr1.length); //原数组长度
arr1 = Arrays.copyOf(arr1,15);
System.out.println(arr1.length); //扩容后的数组长度
}
}
文章浏览阅读864次。创维π盒的外观一改之前创维机顶盒的圆润风格,采用了棱角分明的深色调配色,塑料及小巧的机身,承袭了创维一贯以来的优秀品质,磨砂材质的工艺也起到了一定的“杜绝指纹”作用,机身虽然小巧,但是产品本身却有一定的重量,不会像市面上的劣质机顶盒,接上稍硬一些的线材就被拖着到处晃。和大家说说这款盒子的硬件配置。泰捷的视频播放能力十分强悍,高清的4K画质可以实现秒速切换,加上无广告的视频体验,连续播放一整天都没有卡顿存在,得益于泰捷有六大核心视频技术加持,无论是WiFi还是网线连接,泰捷都可以做到流畅播放,用久不卡。_最强电视盒子
文章浏览阅读8.5k次。在某些特殊网页上面,我们不想让用户刷新或者点出右键菜单来,要达到这个功能需要添加一定的javascript代码才能做到,思路:判断用户点击的是哪个按键keycode,从而屏蔽这些按键的功能。但是IE和FF中的event不一样,要经过浏览器判断,包括e.keycode,FF中用的是e.which,经过这些分析后,就能完成禁止某些按钮功能的作用,下面是实例代码://禁止按键F5document_怎么关掉右键的刷新功能
文章浏览阅读7.2k次,点赞4次,收藏16次。NameNode切换 Hadoop版本:hadoop-2.6.0-CDH5.5.4 namenode切换需要用到hdfs haadmin 命令,该命令有如下方法: hdfs haadmin -transitionToActive <serviceId> 将<serviceId>namenode过渡到active状态当前状态: nn1:s..._warn ha.haadmin: proceeding with manual ha state management even though auto
文章浏览阅读2.8k次,点赞4次,收藏10次。大家好:从本次博客开始为了对应AC项目我要准备程序员的职业思维导图啦 这是个人整理的会慢慢持续更新的呀,深感路漫漫其修远兮我将上下而求索..._程序员职业的思维导图
文章浏览阅读662次。Question世界上有没有这种类型的软件开发项目?可以做到:对客户来说,可以让想法快速变成系统,几天内即可投入使用,产生价值。对老板来说,可以以最低的成本获得最大的利益。对程序员来说,可以不用996,扔掉生发剂,拥抱新生活。从面向企业级应用的开发领域来说,如果有,也只能是基于一些低代码开发平台(LCAP:low code application platform),来实现系统开发这一条..._低代码平台 动态新增删除字段
文章浏览阅读64次。package Text;public class One1 { public static void main(String[] args) { int a[] = {16,25,9,90,23}; int temp = 0; for (int i = 0;i < a.length - 1; i++){ for (int j = 0;j < a.length - 1 -i;j++){
文章浏览阅读3.1k次。在hbuilderX启动拷贝下来的项目的时候uniapp云端打包提示:“DCloud APPID非当前账号所有,请联系应用所有者设置此账号为协作者,或重新生成APPID后打包”解决办法:重新获取一下manifest.json里的云端获取..._此应用 dcloud appid 非当前账号所有,请联系应用所有者 (即此appid的创建者)设置
文章浏览阅读472次。由于windows开发经常出现这个问题,真是令人讨厌,于是得想个法子,干他娘的一炮,以绝后患,二营长,老子的意大利炮呢!以安装scrapy为例:如:pip install scrapy 时出现:error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http:/..._python第三方包安装时报错:microsoft visual c++ 14.0 is required
文章浏览阅读235次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼我用的c语言,大一学的还没忘完。。。。程序非常简单,就是生成随机数,然后根据随机数的结果进行计数就好了。代码贴下面,有兴趣的可以看看。懂行的请不要喷我写的烂。。。。。毕竟不是专业码农。#include#include#includeint main(){srand((unsigned)time(NULL));int count1=0,count2=0,c..._红蓝球概率问题
文章浏览阅读97次。4562: [Haoi2016]食物链【题目描述】 传送门【题解】 简单的拓扑,但是单点不算食物链。代码如下#include<cstdio>#include<cctype>#include<queue>#define MAXN 100005#define MAXE ...
文章浏览阅读760次。https://github.com/esp8266/Arduinohttp://espressif.com/zh-hans/support/explore/faq电路资料图如下:介绍功能:参数引脚引脚定义电路flash:”转载于:https://w...
文章浏览阅读62次。