effecttive java一直推荐使用泛型,简单的看了一下泛型的使用

package cn.com.fzk;

import java.util.ArrayList;
import java.util.List; public class Test1 {
public static class InnerStaticGeneric<T> {
T t;
InnerStaticGeneric<T> instance = new InnerStaticGeneric<T>(); public static <T> InnerStaticGeneric<T> getInstance() {
return new InnerStaticGeneric<T>();
}
} public static void main(String[] args) {
String a = "a";
GenericTest.w(a);
Integer b = ;
GenericTest.w(b); }
} class GenericTest<T> {
public GenericTest() {
} T t; List<T> list = new ArrayList<T>(); public void add(T t) {
list.add(t);
} public T get(int index) {
return list.get(index);
} public static <T> GenericTest<T> getInstance() {
return new GenericTest<T>();
} public static <W> void w(W w) {
System.out.println(w.getClass().getName());
} public static <Q> void q(Q q) {
System.out.println(q.getClass().getName());
} public void t(T t) {
System.out.println(t.getClass());
}

public <E> void e(E e) {
          System.out.println(e.getClass());
      }

}

定义泛型类的时候,<>中的类型随便写,一个大写的字母就可以。在非静态方法中使用到的泛型的类型如果和定义的泛型类的大写的那个字母一样,就不需要制定类型了。如果方法中的泛型的类型未定义需要在方法中制定类型,在e()方法中的那个<E>就是相当于临时定义了一个类型E,如果不定义编译通不过。

静态方法中如果要使用泛型,前边必须定义这个临时类型。如果泛型类中定义了静态方法,其实这个静态方法中的泛型和泛型类中定义的泛型已经没有意义了。泛型在Java中本身就是一个语法糖,在编译的时候已经编译成了实际的类型,是动态的翻译类型,而静态方法是类未编译前就已经编译了,也就是静态方法中所有的类型都是已经确定好的。在泛型类中使用静态方法用来操作我感觉是没有意义的,唯一可能的原因就是这个静态方法从理论上来说应该属于这个类(单一职责)。同时也说明,任何一个非泛型类中,都可以定义一个泛型方法。向下面这样创建一个类及方法也是可以的。这种情况下,定不定义泛型类没有什么意义。

class GenericTest {
public static <W> void w(W w) {
System.out.println(w.getClass().getName());
} public static <Q> void q(Q q) {
System.out.println(q.getClass().getName());
} public <E> void e(E e) {
System.out.println(e.getClass());
}
}

如果想定义一个泛型类,在使用这个泛型类并且还想让这个泛型类定义出来的泛型起作用的话那么就不要用静态方法来操作泛型,new出这个泛型类在调用相应的方法。同时说明,泛型类做不了静态方法工具类。这是我的感觉。不知道是不是有问题。

java 泛型的简单使用的更多相关文章

  1. 利用Java泛型实现简单的泛型方法

    问题:编写一个泛型方法add(),当传入不同数字类型的值时,能够进行加法运算,(如可以传入int.long.float.double类型,但要对传入的值做一定的限定,如必须是数字). 解决:利用泛型编 ...

  2. JAVA泛型解释

    理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: 1 List<Apple> box = ...; 2 Apple apple ...

  3. Java泛型简明教程

    泛型是Java SE 5.0中引入的一项特征,自从这项语言特征出现多年来,我相信,几乎所有的Java程序员不仅听说过,而且使用过它.关于Java泛型的教程,免费的,不免费的,有很多.我遇到的最好的教材 ...

  4. 浅析Java 泛型

    泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...

  5. Java:泛型基础

    泛型 引入泛型 传统编写的限制: 在Java中一般的类和方法,只能使用具体的类型,要么是基本数据类型,要么是自定义类型.如果要编写可以应用于多种类型的代码,这种刻板的限制就会束缚很多! 解决这种限制的 ...

  6. java泛型基础

    泛型是Java SE 1.5的新特性, 泛型的本质是参数化类型, 也就是说所操作的数据类型被指定为一个参数. 这种参数类型可以用在类.接口和方法的创建中, 分别称为泛型类.泛型接口.泛型方法.  Ja ...

  7. 初识java泛型

    1 协变数组类型(covariant array type) 数组的协变性: if A IS-A B then A[] IS-A B[] 也就是说,java中的数组兼容,一个类型的数组兼容他的子类类型 ...

  8. 【Java心得总结四】Java泛型下——万恶的擦除

    一.万恶的擦除 我在自己总结的[Java心得总结三]Java泛型上——初识泛型这篇博文中提到了Java中对泛型擦除的问题,考虑下面代码: import java.util.*; public clas ...

  9. 【Java心得总结三】Java泛型上——初识泛型

    一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...

随机推荐

  1. linux路由服务

    本文介绍怎样使用linux创建一台简单的路由server. 主要包含几个參数的设置:ip_forward和rp_filter. 1.开启IP forwarding # 重新启动后失效 $ echo & ...

  2. Java jar转exe

    http://www.blogjava.net/baoyaer/articles/97405.html Java转exe篇: 实现方式:Eclipse搭配JSmooth(免费). 1.先由Eclips ...

  3. JDBC技术总结(二)

    上一节主要讲了JDBC的基本操作,这一节主要总结一下JDBC如何处理大文本.如何处理图片以及进行批处理. 1.JDBC处理大文本 在MySQL中,大文本是text类型,使用Java操作数据库中的大文本 ...

  4. c#实现记事本

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Atitit.软件硕士  博士课程 一览表 attilax 总结

    Atitit.软件硕士  博士课程 一览表 attilax 总结 1. Attilax聚焦的领域1 2. 研究生硕士博士课程汇总表1 3. 博士课程3 4. Attilax额外的4 5. 参考4 1. ...

  6. VSCode 运行go test显示打印日志

    在VSCode中运行go test,在代码中写的 fmt.Printf("TestB \n") 这些语句均不打印,只显示最终的结果 PASS ok github.com/B .03 ...

  7. 值类型,Nullable类型

    1. 值类型 比如说int吧,是值类型,是个struct,是这样声明的 public struct Int32 : IComparable, IFormattable, IConvertible, I ...

  8. python基础: day4作业计算器

    作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - ...

  9. 使用MYCAT轻松实现MYSQL水平分片

    完整文章下载地址:http://download.csdn.net/detail/dreamcode/9383516 简单来说,我们能够将数据的水平切分理解为是依照数据行的切分.就是将表中的某些行切分 ...

  10. PopupWindowFromBottom 从底部弹出popupwindow

    自定义PopupWindowFromBottom public class PopupWindowFromBottom extends PopupWindow { public PopupWindow ...