- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章一篇文章带你了解java泛型--泛型类,泛型方法,泛型接口由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
官方定义:
泛型是Java SE 1.5的新特性,泛型的本质就是参数化类型,也就是说所操作的数据类型被指定为一个参数 。
这种参数类型可以用在类、接口和方法的创建中,分别成为泛型类、泛型接口、泛型方法 。
优缺点:
优点:可以不用再类型转换了 。
缺点:降低了代码的可读性 。
泛型类:当一个类要操作的引用数据类型不确定的时候,可以给该类定义一个形参,用到这个类的时候,通过传递类型参数的形式,来确定要操作的具体的对象类型。在JDK1.5之前,为了提高代码的通用性,通常把类型定义为所有类的父类型:Object,这样做有两大弊端:1、在具体操作的时候要进行强制类型转换;2、这样还是指定了类型,还是不灵活,对具体类型的方法未知且不安全 。
泛型类的格式:在类名后面声明类型变量,泛型类可以有多个类型变量 。
如:
1
|
public
class
Myname <K,V>
|
什么时候使用泛型类:只要类中操作的引用数据类型不确定,就可以定义泛型类。通过使用泛型类,可以省去强制类型转换的类型转换异常的麻烦 。
泛型类:
1
2
3
4
5
6
|
public
class
FanXingLei<T> {
public
T getE(T t)
{
return
t;
}
}
|
学生类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public
class
Student {
public
String name;
public
int
age;
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
Student(String name,
int
age) {
super
();
this
.name = name;
this
.age = age;
}
@Override
public
String toString() {
return
"Student [name="
+ name +
", age="
+ age +
"]"
;
}
}
|
教师类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public
class
Teacher {
public
String name;
public
int
age;
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
Teacher(String name,
int
age) {
super
();
this
.name = name;
this
.age = age;
}
@Override
public
String toString() {
return
"Teacher [name="
+ name +
", age="
+ age +
"]"
;
}
}
|
测试类:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public
static
void
main(String[] args) {
FanXingLei<Student> stu=
new
FanXingLei<Student>();
Student student=
new
Student(
"小明"
,
20
);
Teacher teacher=
new
Teacher(
"小红"
,
27
);
FanXingLei<Teacher> tu=
new
FanXingLei<Teacher>();
System.out.println(stu.getE(student).getClass().getName());
System.out.println(tu.getE(teacher).getClass().getName());
System.out.println(stu.getE(student).toString());
System.out.println(tu.getE(teacher).toString());
}
}
|
打印结果:
rj.cd.Fx01.Student rj.cd.Fx01.Teacher Student [name=小明, age=20] Teacher [name=小红, age=27] 。
目的:泛型方法也是为了调高代码的重用性和程序安全性。编程原则:尽量设计泛型方法解决问题,如果设计泛型方法可以取代泛型整个类,应该采用泛型方法(如果泛型方法可以搞定就不建议使用泛型类).
泛型方法的格式:类型变量放在修饰符后面和返回类型前面,如:
1
|
public
static
<E> E getMax(T...in)
//三个点表示为多个参数
|
1
2
3
4
5
6
7
8
9
10
11
12
|
public
class
Test {
public
static
void
main(String[] args) {
print(
"你好"
);
print(
200
);
print(
true
);
print(
99.9
);
}
public
static
<T>
void
print(T t) {
System.out.println(t);
}
}
|
打印结果:
你好 200 true 99.9 。
将泛型原理用于接口实现中,就是泛型接口.
泛型接口的格式:泛型接口格式类似于泛型类的格式,接口中的方法的格式类似于泛型方法的格式 。
1
|
public
interface
IFanXingJieKou<T>
|
泛型接口类:
1
2
3
|
public
interface
IFanXingJieKou <T> {
public
T read(T t);
}
|
1
2
3
4
5
6
|
public
class
FanXingImpl
implements
IFanXingJieKou<String> {
@Override
public
String read(String t) {
return
t;
}
}
|
1
2
3
4
5
6
|
public
class
Test {
public
static
void
main(String[] args) {
IFanXingJieKou<String> fK=
new
FanXingImpl();
System.out.println(fK.read(
"hello"
));
}
}
|
hello 。
本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注我的更多内容! 。
原文链接:https://blog.csdn.net/qq_52761400/article/details/117016379 。
最后此篇关于一篇文章带你了解java泛型--泛型类,泛型方法,泛型接口的文章就讲到这里了,如果你想了解更多关于一篇文章带你了解java泛型--泛型类,泛型方法,泛型接口的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
运行 PostgreSQL(7.4 和 8.x),我认为这是可行的,但现在我遇到了错误。 我可以单独运行查询,它工作得很好,但如果我使用 UNION 或 UNION ALL,它会抛出错误。 这个错误:
我试图为我的应用程序创建一个导航,使用抽屉导航我的 fragment 之一(HomeFragment)有一个 ViewPager,可容纳 3 个 fragment (Bundy Clock、Annou
以我目前正在开发的应用为例: - 它有一个包含多个项目的抽屉导航;现在有两个项目让我感兴趣,我将它们称为 X 和 Y。 X 和 Y 都在单击时显示包含 x 元素或 y 元素列表的 fragment 选
我有一个形状为 (370,275,210) 的 NumPy 数组,我想将其重新整形为 (275,210,370)。我将如何在 Python 中实现这一点? 370是波段数,275是行数,210是图像包
我们如何与被子 UIViewController 阻止的父 UIViewController(具有按钮)交互。显然,触摸事件不会通过子 Nib 。 (启用用户交互) 注意:我正在加载默认和自定义 NI
我是 Jpa 新手,我想执行过程 我的代码如下 private static final String PERSISTENCE_UNIT_NAME = "todos"; private static
与安装了 LAMP 的 GCE 相比,选择与 Google Cloud SQL 链接的 GCE 实例有哪些优势? 我确定 GCE 是可扩展的,但是安装在其上的 mysql 数据库的可扩展性如何? 使用
这个问题在这里已经有了答案: Value receiver vs. pointer receiver (3 个答案) 关闭 3 年前。 我刚接触 golang。只是想了解为 Calc 类型声明的两种
我不小心按了一个快捷键,一个非常漂亮的断线出现在日期上。 有点像 # 23 Jun 2010 -------------------- 有人知道有问题的快捷方式吗?? (我在 mac 上工作!) 在
我正在Scala中编写正则表达式 val regex = "^foo.*$".r 这很好,但是如果我想做 var x = "foo" val regex = s"""^$x.*$""".r 现在我们有
以下 XML 文档在技术上是否相同? James Dean 19 和: James Dean 19 最佳答案 这两个文档在语义上是相同的。在 X
我在对数据帧列表运行稳健的线性回归模型(使用 MASS 库中的 rlm)时遇到问题。 可重现的示例: var1 <- c(1:100) var2 <- var1*var1 df1 <- data.f
好的,我有一个自定义数字键盘,可以在标签(numberField)中将数字显示为 0.00,现在我需要它显示 $0.00。 NSString *digit = sender.currentTitle;
在基于文档的应用程序中,使用 XIB 文件,创建新窗口时其行为是: 根据最后一个事件的位置进行定位和调整大小 window 。 如果最后一个事件窗口仍然可见,则新窗口 窗口应该是级联的,这样它就不会直
我想使用参数进行查询,如下所示: SELECT * FROM MATABLE WHERE MT_ID IN (368134, 181956) 所以我考虑一下 SELECT * FROM MATABLE
我遇到一些性能问题。 我有一个大约有 200 万行的表。 CREATE TABLE [dbo].[M8]( [M8_ID] [int] IDENTITY(1,1) NOT NULL,
我在 jquery 中的按键功能遇到问题。我不知道为什么按键功能不起作用。我已经使用了正确的 key 代码。在我的函数中有 2 个代码,其中包含 2 个事件键,按一个键表示 (+) 代码 107 和(
我想显示音频波形,我得到了此代码,它需要.raw音频输入并显示音频波形,但是当我放入.3gp,.mp3音频时,我得到白噪声,有人可以帮助我如何使其按需与.3gp一起使用使用.3gp音频运行它。 Inp
我无法让 stristr 函数返回真值,我相信这是因为我的搜索中有一个 $ 字符。 当我这样做时: var_dump($nopricecart); 完整的 $nopricecart 值是 $0 ,我得
如果我有这样的循环: for(int i=0;i O(n) 次。所以do some执行了O(n)次。如果做某事是线性时间,那么代码片段的复杂度是O(n^2)。 关于algorithm - 带 If 语
我是一名优秀的程序员,十分优秀!