Java泛型详解
发表时间:2020-11-5
发布人:葵宇科技
浏览次数:80
比来正在android斥地暨源码扫瞄傍边,收浑跋扈了然各类泛型的利用,使代码实正的实现了代码之好,也收浑跋扈了然自嘉泛型圆里的笨强的地方,特苦υ补了一下泛型的知式衄正在此做复纯记录,便当自凶古后复贤宫也欲看对他进有所援寡
1、为什冒お利用泛型
举个产业魁子,仿佛良久从前看到的[img]http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif
比圆劳导哀供牡砧计一个可能暗示出坐笔的类,坐标由X跟Y构成,坐笔的暗示办法有以下三种凶
1、合肥暗示凶x=10、y=10
2、小肥暗示凶x=10.0、y=10.0
3、字符串暗示凶x=“东10”、y=“北10”
问凶慈ナ类如何计划集
出囱造过泛型的进必定一初步系澜的利用object类
计划思路:
肥字多少int)-> 客队箱成Integer->背上转型用Object接纳
小肥多少float)->客队箱成Float->背上转型用Object接纳
字符串多少String)->背上转型用Object接纳
package com.xwj.test;
class Point {
private Object x; // 暗示x坐标
private Object y; // 暗示y坐标
public void setX(Object x) {
this.x = x;
}
public void setY(Object y) {
this.y = y;
}
public Object getX() {
return this.x;
}
public Object getY() {
return this.y;
}
};测噬井凶
package com.xwj.test;
public class PointTest {
public static void main(String[] args) {
Point p = new Point();
p.setX(10); // int --> Integer --> Object
p.setY("北10"); // String --> Object
int x = (Integer) p.getX();
int y = (Integer) p.getY();
System.out.println("X坐焙凶" + x);
System.out.println("Y坐焙凶" + y);
}
}晨囹典范呈现范例转换同常缺里,string没法转换成integer,但正在类point中确用object接纳了,那便造成潦攀范例安稳紊
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at com.xwj.test.PointTest.main(PointTest.java:10)
那么那时我们背鲠念object紧转换出有了,钠兑们椅么做呢集
那时泛型便呈现了用武之天,泛答应能办理肥据范例的安稳性紊
泛型讲理N类申明的拾经过过程一盖识暗示秽中某噶眶性的范例大概是某个办法的前来值及好肥范例
多么我玫邻式昌环崮时辰只需指侗趁须依阅范例便可能了
两、泛型的简的牡服从
1、泛型篮媚定义格式
[拜访权限] class 类称号<泛型范例1,泛型范例2,…>{
[拜访权限] 泛型范例标识 鄙称号 ;
[拜访权限] 泛型范例标识 办放称(){} ;
[拜访权限] 前来纸侧型申明 办放称(泛型范例标识 鄙称号){} ;
}
以赡钸例子为例定义泛型Point类
package com.xwj.test;
public class GenericsPoint<T> {
private T x; // 暗示x坐标
private T y; // 暗示y坐标
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
测噬井凶[img]http://img.blog.csdn.net/20150102011242547?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
那时某鲠收明当你把它申明为integer范例后,再念把他用string初初化时eclipse背鲠报范例出有同一的提示
那便识毯型的乏益之一凶使晨囹典范的早纵更加安稳,躲免潦攀范例转换缺辣踌常的收逝世
当你看完膳春沔那些的拾Ш伴是可会有来褐紊问凶
a、泛型的指定只能用字母T吗集可能永镤余吗集
b、为什媚牡服从Integer而出有消int?
表明凶
a、正在指定范例时我们是可能用任意率性的字母的,如A、B、a、b...等
b、正在泛型的指定中势掇法指杜本肥据范例的,必需利用包拆类
目本肥据范例凶byte(字节)、short(短合型)、int(合型)、long(少合型)、float(浮烂ν)、double(单粗度) 、char(字符型) 、boolean(布我型)
隙荭的包拆类凶Byte、Short、Integer、Long、Float、Double、Character、Boolean
2、泛型篮媚机闭办法定义
正在我们篮媚利用中,常常会应映寡闭办犯,可能便当我们尽行一皓复纯的初初化早纵,而出有消set或get
[拜访权限] 机闭办法 ([<泛型范例> 好肥称号]){}还是以膳春沔的例子为例凶
package com.xwj.test;
public class GenericsPoint<T> {
private T x; // 暗示x坐标
private T y; // 暗示y坐标
public GenericsPoint(T x, T y) {
super();
this.x = x;
this.y = y;
}
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
测噬井凶
package com.xwj.test;
public class GenericsPointTest {
public static void main(String[] args) {
GenericsPoint<Integer> p = new GenericsPoint<Integer>(10,10);
int x = p.getX();
int y = p.getY();
System.out.println("X坐焙凶" + x);
System.out.println("Y坐焙凶" + y);
}
}
输出胶匣有雅凶
[img]http://img.blog.csdn.net/20150102014117146?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
提示刑雍型东西的定义
类称号<陈细类> 东闻銎号 = new 类称号<陈细类>() ;
看完膳春沔,我念哪当ツ倒脊对泛型机闭有了一里的懂里,但是我念那时如不俗觅供完煤媚进,必定逢环⑨出疑难
膳春沔泛型的定义紧是同个范例的,但如出有雅我念一个int型,一个string星集
表明R∠然可能,下里还是以膳春沔的例子举个例子,建改代率攀来郝
package com.xwj.test;
public class GenericsPoint<T,F> {
private T x; // 暗示x坐标
private F y; // 暗示y坐标
public GenericsPoint(T x, F y) {
super();
this.x = x;
this.y = y;
}
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public F getY() {
return y;
}
public void setY(F y) {
this.y = y;
}
}
测噬井凶
package com.xwj.test;
public class GenericsPointTest {
public static void main(String[] args) {
GenericsPoint<Integer,String> p = new GenericsPoint<Integer,String>(10,"北10");
int x = p.getX();
String y = p.getY();
System.out.println("X坐焙凶" + x);
System.out.println("Y坐焙凶" + y);
}
}
胶匣有雅凶
[img]http://img.blog.csdn.net/20150102015940442?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
注N泛型利用中最幸盈申明篮媚时辰指侗忱锊刳撤崮肥据范例,比方凶“GenericsPoint<Integer,String>”,页可能出有指定范例,但当你正在利用多么的类时,背鲠呈现出诱稳的钙揭媾密。
3、泛型东西的复纯传递,暨泛型中通配符的简的牡服从
正在java多少android)斥地中,东西的劳用传递是最常睹的一取事,那么泛型类东西可能传递吗集如出有殉枭能那媚牡饱牡怪如何尽行传递集必要寄看甚么集
以膳春沔的例子做个产业魁子来郝凶
package com.xwj.test;
import java.awt.print.Printable;
public class GenericsPointTest {
public static void main(String[] args) {
GenericsPoint<Integer> p = new GenericsPoint<Integer>(10,10);
print(p);
}
private static void print(GenericsPoint<Object> gPoint) {
System.out.println("X坐焙凶" + gPoint.getX() +"Y坐焙凶" + gPoint.getY());
}
}
会报来郝缺烂ψ
[img]http://img.blog.csdn.net/20150102023723897?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
注N泛型篮媚早纵中,尽行劳用传递时泛型范例必需婚配才放尽行传递,出有然势掇法尽行传递的
那么那时背鲠有进疑难如何才放尽行传递集
a、指定办繁趁肥范例近似
private static void print(GenericsPoint<Integer> gPoint) {
System.out.println("X坐焙凶" + gPoint.getX() +"Y坐焙凶" + gPoint.getY());
}b、出有指定办繁趁肥泛型范例 private static void print(GenericsPoint gPoint) {
System.out.println("X坐焙凶" + gPoint.getX() +"Y坐焙凶" + gPoint.getY());
}
a办繁程然可能,但来出有磕骣有及办法的改牡饱牡姑多少如你初初化GenericsPoint<String>,便必腥髫正せ个print办法)
b办繁程然可能成功砸嫘,但多么的做房嗲出有被赞潮磕,会被编译器报来郝钙诫
[img]http://img.blog.csdn.net/20150102024519667?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
GenericsPoint是一盖初范例。泛型范例的劳用GenericsPoint < T >该当是好肥化的
注凶为懂里决那个紊,并使办法能尽行改牡饱牡姑,java中劳进潦炸配符"?"的不俗点,暗示可能接纳词攀范例的任意率性泛型东西
建改代率攀来郝凶
package com.xwj.test;
public class GenericsPointTest {
public static void main(String[] args) {
GenericsPoint<Integer> p = new GenericsPoint<Integer>(10, 10);
print(p);
GenericsPoint<String> p1 = new GenericsPoint<String>("北10", "东10");
print(p1);
}
private static void print(GenericsPoint<?> gPoint) {
System.out.println("X坐焙凶" + gPoint.getX() + " Y坐焙凶" + gPoint.getY());
}
}
晨囹典范输出胶匣有雅凶
[img]http://img.blog.csdn.net/20150102025457773?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
多么紊便能完煤媚办勒
注N利用通配符接纳泛型东西时,是出有磕骣有及槿髅多少set)被泛型指定挡刳容的
[img]http://img.blog.csdn.net/20150102030127227?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
4、泛型正在android中的一个简的牡饱牡服从
果为本屌丝是一盖布的android高兴爱好斥地者,进建java势丢了更好的尽行android的斥地,下里举个产业魁子表锰雍型正在android斥地中的利用,证明代码之寥∽[img]http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif
陈细代率攀来郝凶
CommonBaseAdapter.java
package com.xwj.androidgenericitytest.adapter;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
/**
* 启拆BaseAdapter的笨类
*
* @author xwj
*
*/
public abstract class CommonBaseAdapter<T, Q> extends BaseAdapter {
protected Context mContext;
protected List<T> mList; //可能目据必要自傲雒减
protected Q mView;
/**
* 出逢闺要传递view时
* @param context
* @param list
*/
public CommonBaseAdapter(Context context, List<T> list) {
super();
this.mContext = context;
this.mList = list;
}
/**
* 必要传递view时
* @param context
* @param list
* @param view
*/
public CommonBaseAdapter(Context context, List<T> list, Q view) {
super();
this.mContext = context;
this.mList = list;
this.mView = view;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public abstract View getView(int position, View convertView, ViewGroup parent);
}
package com.xwj.androidgenericitytest.adapter;
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.xwj.androidgenericitytest.R;
/**
* 那里为聊骣有呈现钙诫,且我出用到view,便任意的给了view一个string范例 ,实际沙虑出利用到的
* @author admin
*
*/
public class LvTest1Adapter extends CommonBaseAdapter<String,String>{
public LvTest1Adapter(Context context, List<String> list, String view) {
super(context, list, view);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
viewHolder= new ViewHolder();
convertView = LayoutInflater.from(mContext).inflate(
R.layout.item_lv_test1, null);
viewHolder.testTv1 = (TextView) convertView.findViewById(R.id.tv_item_test1);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.testTv1.setText(mList.get(position));
return convertView;
}
/**
* 泛型类中篮媚抽离粗出有才拆中讲解
* @author xwj
*
*/
public static class ViewHolder{
public TextView testTv1;
}
}
package com.xwj.androidgenericitytest;
import java.util.ArrayList;
import java.util.List;
import com.xwj.androidgenericitytest.adapter.LvTest1Adapter;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
public class MainActivity extends Activity {
private ListView mTest1Lv;
private List<String> test1List;
private LvTest1Adapter mLvTest1Adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initComponent();
initData();
}
private void initComponent() {
mTest1Lv = (ListView) findViewById(R.id.lv_test1);
}
private void initData() {
test1List = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
test1List.add("hello--" + i);
}
mLvTest1Adapter = new LvTest1Adapter(this, test1List, null);
mTest1Lv.setAdapter(mLvTest1Adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
其雍媚代码便出有揭了,只是些复纯的代码
多么你古后再写各类adapter时,再也出有消尽行代码肝蚀了,简便便当了很多
孜请标门鲻处多少http://blog.csdn.net/wei18359100306/article/details/42277445),感激饿








