Java泛型詳解 - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不管是網站(zhàn),軟件還是小程序,都要直接或間接能為您産生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站(zhàn)成為營銷工具,讓軟件能切實提升企業(yè)内部管理水平和(hé)效率。優秀的程序為後期升級提供便捷的支持!

您當前位置>首頁 » 新聞資(zī)訊 » 技術(shù)分享 >

Java泛型詳解

發表時間:2020-11-5

發布人:葵宇科技

浏覽次數:40


比來正在android斥地暨源碼掃瞄傍邊,收渾跋扈了然各類泛型的利用,使代碼實正的實現了代碼之好,也收渾跋扈了然自嘉泛型圓裡的笨強的地方,特苦υ補了一下(xià)泛型的知式衄正在此做複純記錄,便當自兇古後複賢宮也欲看對他進有所援寡
1、為什冒お利用泛型
舉個(gè)産業(yè)魁子(zǐ),仿佛良久從前看到的[img]http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif
比圓勞導哀供牡砧計一個(gè)可(kě)能暗示出坐(zuò)筆的類,坐(zuò)标由X跟Y構成,坐(zuò)筆的暗示辦法有以下(xià)三種兇
1、合肥暗示兇x=10、y=10
2、小肥暗示兇x=10.0、y=10.0
3、字符串暗示兇x=“東10”、y=“北10”
問(wèn)兇慈ナ類如(rú)何計劃集
出囪造過泛型的進必定一初步系瀾的利用object類
計劃思路(lù):

肥字多少(shǎo)int)-> 客隊箱成Integer->背上轉型用Object接納
小肥多少(shǎo)float)->客隊箱成Float->背上轉型用Object接納
字符串多少(shǎo)String)->背上轉型用Object接納
package com.xwj.test;

class Point {
	private Object x; // 暗示x坐(zuò)标
	private Object y; // 暗示y坐(zuò)标

	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坐(zuò)焙兇" + x);
		System.out.println("Y坐(zuò)焙兇" + y);
	}
}
晨囹典範呈現範例轉換同常缺裡,string沒法轉換成integer,但正在類point中(zhōng)确用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緊轉換出有了,鈉兌們椅麼做呢(ne)集
那時泛型便呈現了用武之天,泛答應能辦理肥據範例的安穩性紊
泛型講理N類申明的拾經過過程一蓋識暗示穢中(zhōng)某噶眶性的範例大概是某個(gè)辦法的前來值及好肥範例
多麼我玫鄰式昌環崮時辰隻需指侗趁須依閱範例便可(kě)能了


兩、泛型的簡的牡服從
1、泛型籃媚定義格式

[拜訪權限] class 類稱号<泛型範例1,泛型範例2,…>{
		[拜訪權限] 泛型範例标識 鄙稱号 ;
		[拜訪權限] 泛型範例标識 辦放稱(){} ;
		[拜訪權限] 前來紙(zhǐ)側型申明 辦放稱(泛型範例标識 鄙稱号){} ;
}

以贍钸例子(zǐ)為例定義泛型Point類

package com.xwj.test;

public class GenericsPoint<T> {
	private T x; // 暗示x坐(zuò)标
	private T y; // 暗示y坐(zuò)标

	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
那時某鲠收明當你(nǐ)把它申明為integer範例後,再念把他用string初初化時eclipse背鲠報範例出有同一的提示
那便識毯型的乏益之一兇使晨囹典範的早縱更加安穩,躲免潦攀範例轉換缺辣躊常的收逝世
當你(nǐ)看完膳春沔那些的拾Ш伴是可(kě)會有來褐紊問(wèn)兇
a、泛型的指定隻能用字母T嗎集可(kě)能永镤餘嗎集
b、為什媚牡服從Integer而出有消int?
表明兇
a、正在指定範例時我們是可(kě)能用任意率性的字母的,如(rú)A、B、a、b...等
b、正在泛型的指定中(zhōng)勢掇法指杜本肥據範例的,必需利用包拆類
目本肥據範例兇byte(字節)、short(短(duǎn)合型)、int(合型)、long(少(shǎo)合型)、float(浮爛ν)、double(單粗度) 、char(字符型) 、boolean(布我型)
隙荭的包拆類兇Byte、Short、Integer、Long、Float、Double、Character、Boolean


2、泛型籃媚機閉辦法定義
正在我們籃媚利用中(zhōng),常常會應映寡閉辦犯,可(kě)能便當我們盡行一皓複純的初初化早縱,而出有消set或get

[拜訪權限] 機閉辦法 ([<泛型範例> 好肥稱号]){}
還是以膳春沔的例子(zǐ)為例兇

package com.xwj.test;

public class GenericsPoint<T> {
	private T x; // 暗示x坐(zuò)标
	private T y; // 暗示y坐(zuò)标
	
	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坐(zuò)焙兇" + x);
		System.out.println("Y坐(zuò)焙兇" + y);
	}
}

輸出膠匣有雅兇
[img]http://img.blog.csdn.net/20150102014117146?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
提示刑雍型東西的定義

類稱号<陳細類> 東聞銎号 = new 類稱号<陳細類>() ;

看完膳春沔,我念哪當ツ倒脊對泛型機閉有了一裡的懂裡,但是我念那時如(rú)不俗覓供完煤媚進,必定逢環⑨出疑難
膳春沔泛型的定義緊是同個(gè)範例的,但如(rú)出有雅我念一個(gè)int型,一個(gè)string星集
表明R∠然可(kě)能,下(xià)裡還是以膳春沔的例子(zǐ)舉個(gè)例子(zǐ),建改代率攀來郝
package com.xwj.test;

public class GenericsPoint<T,F> {
	private T x; // 暗示x坐(zuò)标
	private F y; // 暗示y坐(zuò)标
	
	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坐(zuò)焙兇" + x);
		System.out.println("Y坐(zuò)焙兇" + y);
	}
}

膠匣有雅兇
[img]http://img.blog.csdn.net/20150102015940442?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


注N泛型利用中(zhōng)最幸盈申明籃媚時辰指侗忱锊刳撤崮肥據範例,比方兇“GenericsPoint<Integer,String>”,頁可(kě)能出有指定範例,但當你(nǐ)正在利用多麼的類時,背鲠呈現出誘穩的鈣揭媾密。


3、泛型東西的複純傳遞,暨泛型中(zhōng)通(tōng)配符的簡的牡服從
正在java多少(shǎo)android)斥地中(zhōng),東西的勞用傳遞是最常睹的一取事,那麼泛型類東西可(kě)能傳遞嗎集如(rú)出有殉枭能那媚牡飽牡怪如(rú)何盡行傳遞集必要寄看甚麼集
以膳春沔的例子(zǐ)做個(gè)産業(yè)魁子(zǐ)來郝兇

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坐(zuò)焙兇" + gPoint.getX() +"Y坐(zuò)焙兇" + gPoint.getY());
	}
}
會報來郝缺爛ψ
[img]http://img.blog.csdn.net/20150102023723897?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

注N泛型籃媚早縱中(zhōng),盡行勞用傳遞時泛型範例必需婚配才放盡行傳遞,出有然勢掇法盡行傳遞的
那麼那時背鲠有進疑難如(rú)何才放盡行傳遞集
a、指定辦繁趁肥範例近似

private static void print(GenericsPoint<Integer> gPoint) {
		System.out.println("X坐(zuò)焙兇" + gPoint.getX() +"Y坐(zuò)焙兇" + gPoint.getY());
	}
b、出有指定辦繁趁肥泛型範例
	private static void print(GenericsPoint gPoint) {
		System.out.println("X坐(zuò)焙兇" + gPoint.getX() +"Y坐(zuò)焙兇" + gPoint.getY());
	}

a辦繁程然可(kě)能,但來出有磕骣有及辦法的改牡飽牡姑多少(shǎo)如(rú)你(nǐ)初初化GenericsPoint<String>,便必腥髫正せ個(gè)print辦法)

b辦繁程然可(kě)能成功砸嫘,但多麼的做房(fáng)嗲出有被贊潮磕,會被編譯器(qì)報來郝鈣誡
[img]http://img.blog.csdn.net/20150102024519667?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

GenericsPoint是一蓋初範例。泛型範例的勞用GenericsPoint < T >該當是好肥化的
注兇為懂裡決那個(gè)紊,并使辦法能盡行改牡飽牡姑,java中(zhōng)勞進潦炸配符"?"的不俗點,暗示可(kě)能接納詞攀範例的任意率性泛型東西
建改代率攀來郝兇

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坐(zuò)焙兇" + gPoint.getX() + " Y坐(zuò)焙兇" + gPoint.getY());
	}
}

晨囹典範輸出膠匣有雅兇
[img]http://img.blog.csdn.net/20150102025457773?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

多麼紊便能完煤媚辦勒
注N利用通(tōng)配符接納泛型東西時,是出有磕骣有及槿髅多少(shǎo)set)被泛型指定擋刳容的
[img]http://img.blog.csdn.net/20150102030127227?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


4、泛型正在android中(zhōng)的一個(gè)簡的牡飽牡服從
果為本屌絲是一蓋布的android高興愛好斥地者,進建java勢丢了更好的盡行android的斥地,下(xià)裡舉個(gè)産業(yè)魁子(zǐ)表錳雍型正在android斥地中(zhōng)的利用,證明代碼之寥∽[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;  //可(kě)能目據必要自傲雒減
	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一個(gè)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;
	}
	
	/**
	 * 泛型類中(zhōng)籃媚抽離(lí)粗出有才拆中(zhōng)講解
	 * @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;
	}

}

其雍媚代碼便出有揭了,隻是些複純的代碼
多麼你(nǐ)古後再寫各類adapter時,再也出有消盡行代碼肝蝕了,簡便便當了很多
孜請标門鲻處多少(shǎo)http://blog.csdn.net/wei18359100306/article/details/42277445),感激餓


相關(guān)案例查看更多