课时99:泛型方法
1.1泛型方法的基础介绍
在之前的程序类里面实际上已经可以发现在泛型类之中如果将泛型标记写在了方法上,那么这样的方法就被称为泛型方法,但是需要注意的是,泛型方法不一定非要出现在泛型类之中。即:如果一个类上没有定义泛型,那么也可以使用泛型方法。
interface IMessage<T>{ public string echo(T t); } class MessageImpl<S>implements IMessage<S>{ public string echo(s t){return"【ECHO】"+t ; } } public class JavaDemo{ public static void main(string args[]){ IMessage<String>msg =new MessageImpl<String>(); System.out.println(msg.echo("www.mldn.cn")); } } 比如我们现在看一个程序位,JavaDemo在此处没有泛型 public class JavaDemo public static void main(String args[ ]){ 现在用泛型方法了解此处返回和泛型数组 public static T[]fun(T···args) { return args; T描述的是一个数据位型 JavaDemo..java:5:错误:找不到符号 public static fun(T...args){ 此处T没有数据位型,是一个泛型标记 此处应当如下,对T做展现与描述 public static <T> T[]fun(▣··args){ return args;
现在如下:
public class JavaDemo public static void main(String args[ ]){ Integer num [] = fun (1,2,3); //传入了整数,泛型类型就是Integer for (int temp num){ System.out.print(temp +“、”)
过程中自动拆墙处理 ,接下来代码编译,再一次执行
D:mldnjava>javac JavaDemo.java 注:JavaDemo.java使用了未经检查或不安全的操作。 注:有关详细信息,请使用-Xlint:unchecked重新编译。 D:\mldnjava>java JavaDemo 1、2、3、 D:\mldnjava
综上所述:在后期进行项目开发的时候,这种泛型方法很常见。
以之前的工厂设计为例。
传统工厂设计
第一个叫做Imessage,而后有一个叫做Messageimpl操作词汇,这是第一个接口。
第二个接口叫做Channel,而后一个叫做是Database Channel。这里有了一个接口,一个子位,后面可能包含有更多资源,用它做代表,按照传统的方式用工厂设计,传统代码设计过程之中,为了获得Message接口对象,在代码中需要准备一个Message Factory,而后客户端要求能够这样的结构来进行处理,这是工厂设计的结构,按照同样的风格,后续也要Factory的程序位,如果按照这样的结构来进行开发,项目之中一定很混乱。
工厂设计模式本质是好的,它作为解耦合的工厂,设计模式拥有意义,但从另外一个角度而言,整个代码之中,如果此时一个项目有上千个接口,到时候满眼望去都是绝望的身影。
增加接口就要写一个工程的,总的来看工程的功能都一样,当然也可以写在一个上位里,也可以写在一个工厂,那么在一个工厂怎么做如下所示。
首先写Factory,而后Factory后面对应有接口,一个接口要对应叫做两个接口,而后继续分析,每一个接口又要对应它对应的无数个子位,现在的叫做是整体的处理结构。这就会出现一个设计的问题。
对应叫做接口的访问,一个子位结束之后,这个地方也要有一个接口的访问,此处流程完成。此处完成之后,关键在后面的程序代码中工厂所有的都是子位支持,在都支持的时候工厂位中应有多个方法,比如说第一个方法叫Get message Instance():IMessage
,第二个方法叫做G
et
Channel
Instance()
:IChannel
。
这两种方法对应有不同的操作,整个程序看出只有一个工程位,但是这一个工厂位的背后会带来多种情况,当上千个工厂装这个接口的时候,就算有一个工厂位,同样重复的方法可能存在有上千个。
传统工厂在设计开发过程之中功能相同,但是过于重复,需要通过一个程序的方式去解决,如下。
利用代码,这是一种折中方案,利用泛型改进工厂。
Interface IMessage{ public void send(String str); } class MessageImpl implements IMessage{ public void send(String str){ System.out.println("消息发送:"+str); } } class Factory{ public static <T>T getInstance(String className,T t){ if ("messageImpl".equalsIgnorecase(className)){ return new MessageImpl( ); } return null; } } public class JavaDemo{ public static void main(String args[]){ IMessage msg = (IMessage) Factory.getInstance ("messageImpl" IMessage.class); msg.send("www.mldn.cn");
写至此处编译,检查是否能够通过。