Java 中return value的type declare问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 中return value的type declare问题相关的知识,希望对你有一定的参考价值。

我看书上说,如果一个method有返回值,那么之前必须declare a return type,并且返回type必须与declared一致。如:
int theSecret = life.giveSecret();
int giveSecret ( )
return 42;


我的问题是:如果我的method body中是一个if conditional,不同的condition返回的值的类型不一样。比如第一个if 返回int,第二个else if返回String。那么我之前method的return type应该怎么declare?

参考技术A 声明返回类型为Object即可
public Object xxMethod()
if(...)

return 1;

else
return "1";



从这问题看得出来,你是刚接触编程
参考技术B 函数式思维: 利用 Either 和 Option 进行函数式错误处理
http://www.ibm.com/developerworks/cn/java/j-ft13/

Either 旨在保存一个 left 或 right 值(但从来都不会同时保存这两个值)。该数据结构被称为不相交并集。一些基于 C 的语言包含 union 数据类型,它可以保存含若干种不同类型的一个实例。不相交并集的槽可以保存两种类型,但只保存其中一种类型的一个实例。

利用 Either,我可以编写代码来返回异常或 一个合法结果(但从来都不会同时返回两种结果),同时保持类型安全。常见的函数式约定是 Either 类的 left 包含异常(如有),而 right 包含结果。
参考技术C 不要这么做。一定非要如此(例如newInstance方法中)的话就声明为返回它们共同的基类或接口,或者声明成返回object追问

请问什么叫做 “返回他们共同的基类或接口”?您的意思就是说,如果返回值type不同,我就把它们都wrap成object,然后declare返回值的type为object?

追答

是的,如果一个方法既可能返回int,又可能返回String,并且无法避免,那么只有声明为返回Object,但是很可能导致误用,只要可以避免就不要这样定义这样的方法

本回答被提问者采纳

No converter found for return value of type: class java.util.HashMap + 'Content-Type' cannot

背景说明:

环境:IDEA java语言 springmvc.xml 配置 需要用到fastjson jackson pom.xml中配置了需要用到的包,springmvc.xml中也写了注解驱动

Controller中返回Object类型

到返回Map类型的时候

Controller中代码如下:

 @RequestMapping(name="/returnMap.do")
 @RequestMapping("/returnMap.do")
    @ResponseBody //将返回值添加到响应体中
    public  Object returnMap()throws  Exception{
        Map<String,String> map = new HashMap<>();
        map.put("hello","你好");
        map.put("World","先生");
        return map;
    }

运行报: java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.HashMap 说明:首要要看一下library是否导进去,也就是自己写完pom.xml之后有没有reimport,其次看一下注解驱动有没有配置,也就是jackson的那三个包,最后再从其他方面找原因。百度后,又说fastjson版本的问题的,试了无果,加了个

 <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"/>
        </mvc:message-converters>
    </mvc:annotation-driven>

也没解决,后边还添加 :

<!-- https://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl -->
    <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
    </dependency>

然后就换成了报:java.lang.IllegalArgumentException: ‘Content-Type‘ cannot contain wildcard type ‘*‘

然后又是一顿百度,试了各种方法还是没能解决问题  

然后就看到了下边这个试了一下:错误消除,代码如下

 @RequestMapping(name="/returnMap.do",consumes = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody //将返回值添加到响应体中
    public  Object returnMap()throws  Exception{
        Map<String,String> map = new HashMap<>();
        map.put("hello","你好");
        map.put("World","先生");
        return map;
    }

改变部分:

 @RequestMapping(name="/returnMap.do",consumes = MediaType.APPLICATION_JSON_VALUE)
    

注意对比 你就会发现哦!

所以导致最后自己都不知道到底是因为那个解决了问题??

BUT,启动后才返现返回来的消息是:

Status Code:
415 Unsupported Media Type  /(ㄒoㄒ)/~~

参考链接:

http://www.mamicode.com/info-detail-2562906.html

 

以上是关于Java 中return value的type declare问题的主要内容,如果未能解决你的问题,请参考以下文章

Unknown return value type [java.lang.Boolean]] with root cause

java.lang.IllegalArgumentException: No converter found for return value of type:

解决java.lang.IllegalArgumentException: No converter found for return value of type: class java.util.A

SpringNo converter found for return value of type: class java.util.ArrayList

No converter found for return value of type: class java.util.ArrayList

No converter found for return value of type: class java.util.ArrayList