首页 > 编程语言 >Java编程思想10

Java编程思想10

时间:2022-12-25 16:57:40浏览次数:45  
标签:10 Java 对象 编程 元组 new 泛型 return public

第十五章:泛型
我们希望达到的目的是编写更通用的代码,要使代码能够应用于“某种不具体的类型”,而不是一个具体的接口或类。

简单泛型
​ 有许多原因促进了泛型的出现,而最引人注目的一个原因,就是为了创建容器类。有些情况下,我们确实希望容器能够同时持有多种类型的对象。但是,通常而言,我们只会使用容器类来存储一种类型的对象。泛型的主要目的之一就是用来指定容器要持有什么类型的对象,而且由编译器来保证类型的正确性。

一个元组库类
​ 仅一次方法调用就能返回多个对象,你应该经常需要这样的功能吧。可是return语句只允许返回单个对象,因此,解决办法就是创建一个对象,用它来持有想要返回的多个对象。当然,可以在每次需要的时候,专门创建一个类来完成这样的工作。可是有了泛型,我们就能够一次性地解决该问题,以后再也不用在这个问题上浪费时间了。同时,我们在编译期就能确保类型安全。

​ 
这个概念称为元组(tuple),它是将一组对象直接打包存储于其中的一个单一对象。这个容器对象允许读取其中元素,但是不允许向其中存放新的对象。(这个概念也称为数据传送对象,或信使。)

​ 
通常,元组可以具有任意长度,同时,元组中的对象可以是任意不同的类型。不过,我们希望能够为每一个对象指明其类型,并且从容器中读取出来时,能够得到正确的类型。要处理不同长度的问题,我们需要创建多个不同的元组。下面的程序是一个2维元组,它能够持有两个对象∶

public class TwoTuple<A, B> {
public final A first;

public final B second;

public TwoTuple(A a, B b) {
first = a;
second = b;
}
// 注意:元组隐含地保持了其中元素的次序
public String toString() {
return "(" + first + ", " + second + ")";
}
}

 

​ 构造器捕获了要存储的对象,而toString()是一个遍历函数,用来显示列表中的值。注意:元组隐含地保持了其中元素的次序。

我们可以利用继承机制实现长度更长的元组,从下面的例子中可以看到,增加类型参数是件很简单的事情:

/**

/**
* 三维元组
*/
public class ThreeTuple<A, B, C> extends TwoTuple<A, B> {

public final C third;

public ThreeTuple(A a, B b, C third) {
super(a, b);
this.third = third;
}

@Override
public String toString() {
return "(" + first + ", " + second + ", " + third + ")";
}
}

/**
* 四维元组
*/
public class FourTuple<A,B,C,D> extends ThreeTuple<A,B,C> {
public final D fourth;
public FourTuple(A a, B b, C c, D d) {
super(a, b, c);
fourth = d;
}
public String toString() {
return "(" + first + ", " + second + ", " +
third + ", " + fourth + ")";
}
}

/**
* 五维元组
*/
public class FiveTuple<A,B,C,D,E> extends FourTuple<A,B,C,D> {
public final E fifth;
public FiveTuple(A a, B b, C c, D d, E e) {
super(a, b, c, d);
fifth = e;
}
public String toString() {
return "(" + first + ", " + second + ", " +
third + ", " + fourth + ", " + fifth + ")";
}
}

 ​ 为了使用元组,你只需要定义一个长度适合的元组,将其作为方法的返回,然后在return语句中创建该元组,并返回即可。

class Amphibian {}
class Vehicle {}

public class TupleTest {
static TwoTuple<String,Integer> f() {
// Autoboxing converts the int to Integer:
return new TwoTuple<>("hi", 47);
}

static ThreeTuple<Amphibian,String,Integer> g() {
return new ThreeTuple<>(new Amphibian(), "hi", 47);
}

static FourTuple<Vehicle,Amphibian,String,Integer> h() {
return new FourTuple<>(new Vehicle(), new Amphibian(), "hi", 47);
}

static FiveTuple<Vehicle,Amphibian,String,Integer,Double> k() {
return new FiveTuple<>(new Vehicle(), new Amphibian(), "hi", 47, 11.1);
}

public static void main(String[] args) {
TwoTuple<String,Integer> ttsi = f();
System.out.println(ttsi);
// ttsi.first = "there"; // Compile error: final
System.out.println(g());
System.out.println(h());
System.out.println(k());
}
}

 

内部类Node也是一个泛型,它拥有自己的类型参数。

​ 这个例子使用了一个末端哨兵(end sentinel)来判断堆栈何时为空。这个末端哨兵是在构造LinkedStack时创建的。然后,每调用一次push()方法,就会创建一个Node<T>对象,并将其链接到前一个Node<T>对象。当你调用pop()方法时,总是返回top.item,然后丢弃当前top所指的Node<T>,并将top转移到下一个Node<T>,除非你已经碰到了未端哨兵,这时候就不再移动top了。如果已经到了末端,客户端程序还继续调用pop()方法,它只能得到null,说明堆栈已经空了。

泛型方法
​ 到目前为止,我们看到的泛型,都是应用于整个类上。但同样可以在类中包含参数化方法,而这个方法所在的类可以是泛型类,也可以不是泛型类。 也就是说,是否拥有泛型方法,与其所在的类是否是泛型没有关系。

​ 泛型方法使得该方法能够独立于类而产生变化。以下是一个基本的指导原则:无论何时,只要你能做到,你就应该尽量使用泛型方法。也就是说,如果使用泛型方法可以取代将整个类泛型化,那么就应该只使用泛型方法,因为它可以使事情更清楚明白。另外,对于一个static的方法而言,无法访问泛型类的类型参数,所以,如果static方法需要使用泛型能力,就必须使其成为泛型方法。

标签:10,Java,对象,编程,元组,new,泛型,return,public
From: https://www.cnblogs.com/LvJinshuai/p/17004218.html

相关文章

  • 关于 java: 错误: 无效的源发行版
    工具:IDEA、Maven问题:在更换JDK后,原先的项目运行时出现java:错误:无效的源发行版:16解决方案:1、打开项目结构,更新项目JDK和项目语言级别2、更新Maven配......
  • 推荐-centos7安装高版本python3.10
    前言如果在centos7上编译安装python3.7以上版本,ssl功能会出问题,因为python3.7以后需要更高版本的openssl支持,这样的话,就需要提前编译安装高版本的openssl,比如1.1.1系列,这......
  • 教你用JavaScript实现乘法游戏
    案例介绍欢迎来的我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个乘法积分游戏。乘法游戏主要通过用户输入的数值和程序计算的数......
  • 5个JavaScript的字符串处理库
    英文| ​​https://blog.bitsrc.io/5-string-manipulation-libraries-for-javascript-5de27e48ee62​​​使用字符串可能是一项繁琐的任务,因为有许多不同的用例。例如,将字......
  • JavaScript中的简单排序算法
    英文| https://medium.com/javascript-in-plain-english/simple-sorting-algorithms-in-javascript-57d512ceaf5d翻译|web前端开发排序是程序员处理数据处理时最常见的......
  • 7种你应该知道的JavaScript常见的错误
    英文| ​​https://blog.bitsrc.io/types-of-native-errors-in-javascript-you-must-know-b8238d40e492​​​从浏览器的控制台到运行Node.js的计算机终端,我们到处都会看......
  • 请停止在JavaScript中使用类,你将成为一名更好的开发人员
    英文| https://medium.com/javascript-in-plain-english/please-stop-using-classes-in-javascript-and-become-a-better-developer-a185c9fbede1多年来,OOP(面向对象编程)一......
  • javaweb 7、Cookie、Session
    Cookie创建项目javaweb-session-cookie2.补全目录java、resouces更新web.xml<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="https://jakarta.ee/xml/......
  • JavaScrip基础(三):数组
    索引数组内存中连续存储多个数据的数据结构创建创建空数组1.vararr=[];2.vararr=newArray();创建包含元素的数组vararr2=[97,85,79];vararr3=newArray("Tom......
  • 10个JavaScript代码片段,帮助你成为更好的开发者
    英文 | ​​https://medium.com/better-programming/10-javascript-code-snippets-you-can-use-right-now-e1bb7c7ec35e​​翻译|web前端开发(ID:web_qdkf)毫无疑问,JavaS......