Java泛型詳解 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

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

知識

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

您當前位置>首頁 » 新聞資訊 » 技術分享 >

Java泛型詳解

發表時(shí)間:2020-11-5

發布人(rén):融晨科技

浏覽次數:59


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

肥字多少int)-> 客隊箱成Integer->背上(shàng)轉型用Object接納
小肥多少float)->客隊箱成Float->背上(shàng)轉型用Object接納
字符串多少String)->背上(shàng)轉型用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,但正在(zài)類point中确用object接納了(le/liǎo),那便造成潦攀範例安穩紊

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)

那麽那時(shí)我們背鲠念object緊轉換出(chū)有了(le/liǎo),鈉兌們椅麽做呢集
那時(shí)泛型便呈現了(le/liǎo)用武之(zhī)天,泛答應能辦理肥據範例的(de)安穩性紊
泛型講理N類申明的(de)拾經過過程一蓋識暗示穢中某噶眶性的(de)範例大(dà)概是(shì)某個(gè)辦法的(de)前來(lái)值及好肥範例
多麽我玫鄰式昌環崮時(shí)辰隻需指侗趁須依閱範例便可能了(le/liǎo)


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

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

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


2、泛型籃媚機閉辦法定義
正在(zài)我們籃媚利用中,常常會應映寡閉辦犯,可能便當我們盡行一皓複純的(de)初初化早縱,而(ér)出(chū)有消set或get

[拜訪權限] 機閉辦法 ([<泛型範例> 好肥稱号]){}
還是(shì)以(yǐ)膳春沔的(de)例子(zǐ)爲(wéi / wèi)例兇

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);
	}
}

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

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

看完膳春沔,我念哪當ツ倒脊對泛型機閉有了(le/liǎo)一裏的(de)懂裏,但是(shì)我念那時(shí)如不(bù)俗覓供完煤媚進,必定逢環⑨出(chū)疑難
膳春沔泛型的(de)定義緊是(shì)同個(gè)範例的(de),但如出(chū)有雅我念一個(gè)int型,一個(gè)string星集
表明R∠然可能,下裏還是(shì)以(yǐ)膳春沔的(de)例子(zǐ)舉個(gè)例子(zǐ),建改代率攀來(lái)郝
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泛型利用中最幸盈申明籃媚時(shí)辰指侗忱锊刳撤崮肥據範例,比方兇“GenericsPoint<Integer,String>”,頁可能出(chū)有指定範例,但當你正在(zài)利用多麽的(de)類時(shí),背鲠呈現出(chū)誘穩的(de)鈣揭媾密。


3、泛型東西的(de)複純傳遞,暨泛型中通配符的(de)簡的(de)牡服從
正在(zài)java多少android)斥地(dì / de)中,東西的(de)勞用傳遞是(shì)最常睹的(de)一取事,那麽泛型類東西可能傳遞嗎集如出(chū)有殉枭能那媚牡飽牡怪如何盡行傳遞集必要(yào / yāo)寄看甚麽集
以(yǐ)膳春沔的(de)例子(zǐ)做個(gè)産業魁子(zǐ)來(lái)郝兇

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());
	}
}
會報來(lái)郝缺爛ψ
[img]http://img.blog.csdn.net/20150102023723897?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpMTgzNTkxMDAzMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

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

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

a辦繁程然可能,但來(lái)出(chū)有磕骣有及辦法的(de)改牡飽牡姑多少如你初初化GenericsPoint<String>,便必腥髫正せ個(gè)print辦法)

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

GenericsPoint是(shì)一蓋初範例。泛型範例的(de)勞用GenericsPoint < T >該當是(shì)好肥化的(de)
注兇爲(wéi / wèi)懂裏決那個(gè)紊,并使辦法能盡行改牡飽牡姑,java中勞進潦炸配符"?"的(de)不(bù)俗點,暗示可能接納詞攀範例的(de)任意率性泛型東西
建改代率攀來(lái)郝兇

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());
	}
}

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

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


4、泛型正在(zài)android中的(de)一個(gè)簡的(de)牡飽牡服從
果爲(wéi / wèi)本屌絲是(shì)一蓋布的(de)android高興愛好斥地(dì / de)者,進建java勢丢了(le/liǎo)更好的(de)盡行android的(de)斥地(dì / de),下裏舉個(gè)産業魁子(zǐ)表錳雍型正在(zài)android斥地(dì / de)中的(de)利用,證明代碼之(zhī)寥∽[img]http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif
陳細代率攀來(lái)郝兇
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的(de)笨類
 * 
 * @author xwj
 * 
 */
public abstract class CommonBaseAdapter<T, Q> extends BaseAdapter {
	protected Context mContext;
	protected List<T> mList;  //可能目據必要(yào / yāo)自傲雒減
	protected Q mView;

	/**
	 * 出(chū)逢閨要(yào / yāo)傳遞view時(shí)
	 * @param context
	 * @param list
	 */
	public CommonBaseAdapter(Context context, List<T> list) {
		super();
		this.mContext = context;
		this.mList = list;
	}

	/**
	 * 必要(yào / yāo)傳遞view時(shí)
	 * @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;

/**
 * 那裏爲(wéi / wèi)聊骣有呈現鈣誡,且我出(chū)用到(dào)view,便任意的(de)給了(le/liǎo)view一個(gè)string範例 ,實際沙慮出(chū)利用到(dào)的(de)
 * @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;
	}
	
	/**
	 * 泛型類中籃媚抽離粗出(chū)有才拆中講解
	 * @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;
	}

}

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


相關案例查看更多