`

Java方法返回多种类型

    博客分类:
  • java
阅读更多

我的文章都整理添加到了个人博客中,大家可以添加这个RSS以便获得即时的文章信息。

 

说明:

1.本文讲述3种方式 如有更好方式 欢迎讨论

2.本例前准备:下载jar包:

  1. http://sourceforge.net/ 下搜索下载json-lib、ezmorph
  2. http://commons.apache.org/  下搜索下载以下jar
    lang(注意 不要使用最新的3.1 用2.6)、collections、beanutils

3.三种方式简要说明

  1. Json方式(目前web开发常用的方式)
  2. 集合方式(最容易想到)
  3. 泛型元组(最简单最实用)

4.具体内容看注释 写的很清楚,如有疑问欢迎讨论

 

1.测试类

package com.cxyapi.generics;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import net.sf.json.JSONObject;

/** Java方法返回多种类型
 * @author cxy @ www.cxyapi.com
 */
public class ReturnMultipleResult
{
	public static void main(String[] args)
	{
		//方式一:使用json
		JSONObject result1=ReturnMultipleResult.way1();
		System.out.println(result1);
		JSONObject jos=(JSONObject)result1.get("s");
		System.out.println(jos.get("name"));
		/* JSONObject中存放的都是Object类型(其实是JSONObject类型)
		 * 如果想使用原来的类型,还需要其他的转换方式(toBean方法)
		 * 但是toBean方法 对于 有自定义构造函数的class,还需要一个init方法或定义映射
		 * 好麻烦呀~
		 * 并且这种方式还需要导入各种jar包
		 * 但是这种方式并不是一无是处,在action/controller层面还是很好用的,不适合纯业务处理的bo层。
		 */
		System.out.println("========================");
		
		//方式二:集合
		Map<String,Object> result2=ReturnMultipleResult.way2();
		System.out.println(result2);
		for(Entry<String, Object> one: result2.entrySet())
		{
			if(one.getKey().equals("s"))
			{
				Student s=(Student)one.getValue();
				s.show();
			}else if(one.getKey().equals("t"))
			{
				Teacher t=(Teacher)one.getValue();
				t.show();
			}
		}
		/* 这种方式采用Object超级父类来擦出类型差异
		 * 但是这种方式处理起来比较复杂,你需要自己判断到底是哪种类型的,并做相应的类型转化
		 */
		System.out.println("========================");
		
		//方式三:使用泛型元组
		TwoTuple<Student, Teacher> result3=ReturnMultipleResult.way3();
		result3.first.show();
		result3.second.show();
		System.out.println(new TwoTuple<String,Integer>("cxy",1));
		//应该不用多说了吧~ 优势太明显了,不用判断,不用转型,不用导入jar包,随意更换类型
	}
	
	//方式一:使用json返回多个结果对象
	public static JSONObject way1()
	{
		Student s=new Student("小明","清华大学");
		Teacher t=new Teacher("cxyapi", "Java编程");
		JSONObject backObject=new JSONObject();
		backObject.put("s", s);
		backObject.put("t", t);
		return backObject;
	}
	
	//方式二:集合方式
	public static Map<String,Object> way2()
	{
		Student s=new Student("小明","清华大学");
		Teacher t=new Teacher("cxyapi", "Java编程");
		Map<String,Object> backObject=new HashMap<String, Object>();
		backObject.put("s", s);
		backObject.put("t", t);
		return backObject;
	}
	
	//方式二:泛型元组
	public static TwoTuple<Student, Teacher> way3()
	{
		Student s=new Student("小明","清华大学");
		Teacher t=new Teacher("cxyapi", "Java编程");
		return new TwoTuple<Student, Teacher>(s,t);
	}
}

 

    元组:

package com.cxyapi.generics;

/** 元组  可以让一个方法返回多个对象
 * @author cxy @ www.cxyapi.com
 */
public class TwoTuple<A,B>
{
	/* 定义成final 是为了保证其安全性,不能进行修改
	 * public final 比private+getter/setter更符合当前的需求
	 */
	public final A first; 
	public final B second;
	
	public TwoTuple(A a,B b)
	{
		first=a;
		second=b;
	}
	
	public static TwoTuple<String,Integer> tupleTest()
	{
		return new TwoTuple<String,Integer>("cxy",1);
	}
	
	public static void main(String[] args)
	{
		System.out.println(TwoTuple.tupleTest().first);
		System.out.println(TwoTuple.tupleTest().second);
	}
}

 

   涉及到的Student类和Teacher类

package com.cxyapi.generics;

/**
 * @author cxy @ www.cxyapi.com
 */
public class Teacher
{
	private String name; // 姓名

	private String course; // 课程

	public Teacher(String name, String course)
	{
		this.name = name;
		this.course = course;
	}
	
	public void show()
	{
		System.out.println("我叫:"+this.name+",是一名"+this.course+"教师");
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getCourse()
	{
		return course;
	}

	public void setCourse(String course)
	{
		this.course = course;
	}
}

 

package com.cxyapi.generics;

/**
 * @author cxy @ www.cxyapi.com
 */
public class Student
{
	private String name;  //姓名
	
	private String school;  //就读学校

	public Student(String name, String school)
	{
		this.name = name;
		this.school=school;
	}
	
	public Student init()
	{
		return new Student("1", "2");
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getSchool()
	{
		return school;
	}

	public void setSchool(String school)
	{
		this.school = school;
	}
	
	public void show()
	{
		System.out.println("我叫:"+this.name+",就读于"+this.school);
	}

}

 

 

声明:

1.原创文章,转载请标明并加本文连接。

2.文章反映个人愚见,如有异议欢迎讨论指正

3.更多的内容请看我的  个人博客(测试版)

8
11
分享到:
评论
14 楼 snkcxy 2013-03-20  
liwei113114 写道
感觉楼主就是把一些动态语言(python,scala)的特性移植到java中来了。

呵呵 没这么高级 就是看书+实践 觉得不错 分享给大家~
有不足的地方还希望大家多指教~
13 楼 liwei113114 2013-03-20  
感觉楼主就是把一些动态语言(python,scala)的特性移植到java中来了。
12 楼 snkcxy 2013-03-20  
rainsilence 写道
CXY API这个思路不错。。可惜内容是和作者的水平挂钩的。

所以,里面很多文章都有问题。

比如最后一篇,类型判断。

反射是万能的。你说无法判断基本类型

其实Class.isPrimitive方法就可以判断是否是基本类型。

比如 int i  我如何通过反射判断i是int类型的?
不要说这个有没有意义  这个问题先前讨论过了
还有你说很多文章都有问题 一定要说出哪些文章还有问题
一定要回答呀~
11 楼 snkcxy 2013-03-20  
jjcang 写道
做个返回对象,或者数组就可以了。

嗯 其实元组的方式就是返回对象,只不过类型不是定死的
嗯 数组倒是一种方式 Object[]
10 楼 snkcxy 2013-03-20  
rainsilence 写道
CXY API这个思路不错。。可惜内容是和作者的水平挂钩的。

所以,里面很多文章都有问题。

比如最后一篇,类型判断。

反射是万能的。你说无法判断基本类型

其实Class.isPrimitive方法就可以判断是否是基本类型。

呵呵 本人能力是有限 请多赐教
不过我说的是判断是哪种基本类型,不是判断是否是基本类型 这个有对应方法么?还没细研究过反射的所有方法 请赐教
还有哪些文章有问题 请赐教~
9 楼 jjcang 2013-03-20  
做个返回对象,或者数组就可以了。
8 楼 rainsilence 2013-03-20  
CXY API这个思路不错。。可惜内容是和作者的水平挂钩的。

所以,里面很多文章都有问题。

比如最后一篇,类型判断。

反射是万能的。你说无法判断基本类型

其实Class.isPrimitive方法就可以判断是否是基本类型。
7 楼 snkcxy 2013-03-20  
mylazygirl 写道
snkcxy 写道
N人真多呀~ 我觉得元组是泛型一个很不错的应用实例,居然也有人踩

嗯,这个确实不错,我在C#和python编程时会用到,挺方便,倒是还没想过在java中模拟。

高人呀 会这么多语言
6 楼 mylazygirl 2013-03-20  
snkcxy 写道
N人真多呀~ 我觉得元组是泛型一个很不错的应用实例,居然也有人踩

嗯,这个确实不错,我在C#和python编程时会用到,挺方便,倒是还没想过在java中模拟。
5 楼 snkcxy 2013-03-20  
N人真多呀~ 我觉得元组是泛型一个很不错的应用实例,居然也有人踩
4 楼 snkcxy 2013-03-20  
javaseer 写道
那如果想返回345678个对象元组还有办法做吗?

呵呵 继承就可以了
3 楼 javaseer 2013-03-20  
那如果想返回345678个对象元组还有办法做吗?
2 楼 javaseer 2013-03-20  
哇 回来试试 元组的方式
1 楼 snkcxy 2013-03-20  
如果有更多好的方式 欢迎大家讨论

相关推荐

    Java方法返回多种类型.docx

    这篇文档介绍了三种在Java中实现方法返回多种类型的方法,包括使用JSONObject、集合Map以及泛型元组。以下是对这些方法的详细说明: 1. 使用JSONObject: - 在第一种方法中,通过将多个对象序列化到一个JSONObject...

    JAVA利用泛型返回类型不同的对象方法

    在Java编程中,泛型是一种强大的工具,它允许我们在类、接口和方法中定义类型参数,从而实现对多种数据类型的通用处理。泛型的主要目的是提高代码的类型安全性和重用性,减少类型转换的需要,并在编译时捕获可能的...

    Dwr源码示例,包含调用java方法返回不同的类型

    在这个"Dwr源码示例"中,我们将深入探讨如何使用DWR调用Java方法,并处理各种类型的参数和返回值。 首先,DWR的核心功能是提供了一种安全、高效的AJAX(异步JavaScript和XML)框架。它通过创建一个JavaScript到Java...

    mysql时间类型对应的java类型1

    - 当从数据库查询结果中获取时间类型时,会返回相应的Java SQL类型对象,例如`ResultSet.getDate()`, `ResultSet.getTime()`, 或 `ResultSet.getTimestamp()`。 示例代码展示了如何进行转换: ```java import ...

    java 泛型方法使用示例

    泛型方法是泛型技术在类方法层面的应用,它允许我们定义一个可以处理多种数据类型的通用方法。下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法...

    java中String类型和int类型比较及相互转换

    本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序性能具有重要意义。 ### 一、String类型与int类型的基本概念 #### 1.1 String类型 String类型在...

    Java类型检查,类型推断以及限制.pdf

    此外,`void`类型的Lambda表达式在Java中也有其特殊之处,如`Consumer&lt;T&gt;`接口,它接受一个类型为T的对象并执行某种操作,但不返回任何值。例如,`Consumer&lt;String&gt; b = s -&gt; list.add(s);`将字符串添加到列表中。 ...

    java 构造方法的资源

    构造方法与类名相同,没有返回类型,也不需要在方法签名中声明void。了解和熟练使用构造方法是Java面向对象编程的基础,下面将详细阐述Java构造方法的相关知识点。 一、构造方法的作用 构造方法的主要任务是在创建...

    java的Date类型转换成MySQL的DateTime类型.docx

    1. **创建转换方法**:定义一个名为`DateToMySQLDateTimeString`的方法,该方法接受一个`java.util.Date`对象作为参数,并返回符合MySQL `DateTime`格式的字符串。 2. **解析日期和时间**:利用`Date`对象的`...

    Java常用包

    * getReturnType()方法:返回方法的返回类型 * invoke()方法:调用方法 九、Field类 Field类提供了多种实例方法,包括: * get()方法:返回字段的值 * getGenericType()方法:返回字段的泛型类型 * getName()方法...

    java对象转换String类型的三种方法共1页.pdf

    `String.valueOf()`方法可以接受多种数据类型作为参数,包括基本类型和引用类型。对于对象,它实际上会调用对象的`toString()`方法。如果参数为null,它会返回"null"字符串。例如: ```java MyObject obj = new ...

    java-数据类型转换、运算符、方法入门_java_

    在Java编程语言中,数据类型转换、运算符和方法是构建程序的基础元素。这篇入门级资料将引导初学者深入理解这些关键概念。 首先,我们来探讨数据类型转换。Java提供了两种类型转换:自动类型转换(隐式转换)和强制...

    java中string和int型的相互转换.doc

    Java 中的 String 和 int 类型的相互转换是一个基本的数据类型转换操作,我们可以使用多种方法来实现这种转换,例如使用 `Integer.parseInt()` 方法、`Integer.valueOf()` 方法、`String.valueOf()` 方法等。...

    Java方法句柄1

    总的来说,Java方法句柄提供了一种高效且类型安全的方式来处理方法调用,它与反射和`invokeDynamic`指令结合,为Java应用程序提供了强大的动态性,尤其在实现动态语言和高性能代码生成场景中显得尤为重要。

    java常用工具类和接口返回对象.zip

    本压缩包"java常用工具类和接口返回对象.zip"很可能包含了多种实用的工具方法和设计模式,如工厂模式、单例模式等,用于处理常见的任务,如字符串操作、日期时间处理、集合操作等。 1. **StringUtil**:这个工具类...

    java方法通用返回结果集封装操作

    在 Java 编程中,方法的返回结果可以是各种类型的,如基本数据类型、对象、集合等。为了方便地处理返回结果,Java 提供了多种封装方式,包括使用 HashMap、泛型对象等。 1. 使用 HashMap 封装返回结果 使用 ...

    java 访问各种类型数据库的方法

    ### Java访问各种类型数据库的方法 #### 一、前言 在现代软件开发中,数据库扮演着极其重要的角色,用于存储和管理数据。Java作为一种广泛使用的编程语言,提供了多种方式来访问不同类型的数据存储系统。本文旨在...

    java-数组与方法及面向对象基础

    多态使得代码更加灵活,可以处理多种类型的数据。 为了实现面向对象编程,我们还需要了解构造器、抽象方法、接口、访问控制、重载和重写等概念。 构造器用于初始化新创建的对象,比如`public MyClass(int value) {...

    深入java虚拟机.pdf

    方法信息包括方法的名称、方法的返回类型、方法的参数列表等。 六、Java 虚拟机的垃圾收集 Java 虚拟机的垃圾收集是指在 Java 虚拟机中自动地回收不再使用的对象,以释放内存空间。垃圾收集可以是周期性的,也可以...

    高阶Java-Java枚举类型 enum 应用详解

    在这里,`Color`是枚举类型,`RED`, `GREEN`, `BLUE`是枚举的实例,它们默认继承自`java.lang.Enum`类。 2. 访问枚举实例: 你可以通过枚举类型直接访问其实例,例如: ```java Color color = Color.RED; ``` 3. ...

Global site tag (gtag.js) - Google Analytics