java泛型中的自限定类型有什么作用 5C

java泛型中的自限定类型有什么作用?具体举个例子,一个应用场景

8个回答

最重要的是限定泛型的类型,以便为泛型的调用者提供更精确的编译能力。

比如说,你写了一个泛型类型的排序。
void sort(Collection col)
显然作为排序,你的程序需要比较两个元素的大小,来确定它们的相对关系。
比如

 void sort<T>(Collection<T> col)
{
for (int i = 0; i < col.size() - 1; i++)
for (int j = i; i < col.size() - 1; j++)
{
if (比较 col.get(j) 和 col.get(j + 1))
{
//交换
}
}
}

现在的问题是if (比较 col.get(j) 和 col.get(j + 1))这个怎么写?
也许你想,我们可以写
if (col.get(j).compareTo(col.get(j + 1)))
但是怎么保证传入的元素有compareTo这个方法呢?
你可以将T限定在Compareable接口上。
这样做,编译器可以直接检查传入的T是否实现了这个接口。如果不符合,就不通过编译,而你的程序,直接放心调用就可以了。

@caozhy 给出了限定类型泛型的作用,即,限制类型参数的范围,同时可以使用限定的界限包含的方法。比如caozhy提出的例子调整成可用的形式:

    public static <T extends Number> void sort(List<T> col) {
        for (int i = 0; i < col.size() - 1; i++)
            for (int j = i; i < col.size() - 1; j++) {
                if (col.get(j).longValue() > col.get(j + 1).longValue()) {//可以直接使用Number的方法
                    // 交换
                }
            }
    }

什么样的是自限定类型呢?即,限定范围就是自身。比如一个实现了Comparable接口的的User类,希望只能和User类的实例进行比较,那么我们需要这样写:

    static class User2 implements Comparable<User2>{
        public int compareTo(User2 o) {
            //
        }   
    }

这样就利用了限定类型的两个用处:1.限定范围;2.可以使用限定类的方法。另外一个点,就是限定了只能是同类型的进行比较。

我们再来看一个更复杂的,jdk里的Enum类定义:

 public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable{
}

这是一个更复杂的限定类型,为什么要这么复杂呢?如果我们写成简单的样子行不行?像这样:

 public abstract class Enum
        implements Comparable<Enum>, Serializable{
}

(关于Enum类和子类之间的关系,可以参考这里:https://www.cnblogs.com/ly-radiata/articles/6049822.html)
不是同样可以起到限定范围在Enum类么?为什么又要多次一举,弄得这么复杂?
这和Enum类的作用有关系,Enum这个抽象类是用来被继承的,所以我们总是在定义和使用Enum的子类,而且我们希望enum Day和enum Month只能自己的枚举值之间进行比较,而不能互相比较。比如Monday和January就不能比较,因为比较是没有意义的。

看明白了这里,我们再来看一下,简化了的Enum能不能达到上述的限制目的?

 class Day extends Enum{
 }

 class Month extends Enum{
 }

 public satic void main(String[] args){
     Day monday = new Day("monday");
         Month january = new Month("january");
     monday.compareTo(january);// 1
 }

上述1位置的compareTo方法,在简化的Enum情况下是可以的,但是在jdk中复杂的Enum下是不可以的。这也就是为什么jdk里的Enum要定义的这么复杂,目的就是为了限制Enum的子类只能和自己同类的实例进行比较。

说的浅显一点,就是更加明确使用的对象.更方便调用.
不然如果定一下成Object的话.还需要进行一步强转在继续使用

你可以反过来想一想如果没有限定类型同样的代码该怎么写,是不是会多写很多方法才能实现,或者写一些很别扭的代码才能实现

如楼上所说,明确对象,方便使用
不然没有泛型用object对象,还要进行装包、拆包或强转操作,没有效率

自己去看官方文档泛型的定义

zhang_senlin
zhang_senlin 给个链接 ,虽然不是官方,但也差不多了 http://www.runoob.com/java/java-generics.html
2 年多之前 回复

泛型靠谱的用途就是将运行时期的错误放到了编译时期,避免了类型强转。具体使用你可以看我的一片博文
http://blog.csdn.net/whb3299065/article/details/79105750

自限定所做的就是要求在继承关系中,强制要求将正在定义的类当做参数传递给基类。可以保证类型参数必须与正在被定义的类相同:
1.提高了可读性,一看便知道里面放的是什么。
2.提高了安全性,防止对象的转换出错。

class SelfBounded>{

T element;

SelfBounded set(T arg){

element=arg;

return this;

}

T get(){return element;}

}

class A extends SelfBounded{}

class B extends SelfBounded
{}

class C extends SelfBounded{

C setAndGet(C arg){

set(arg);

return get();

}

}

class D{}

//因为类D没有继承SelfBounded,所以该类编译失败。

//class E extends SelfBounded{}

class SelfBounding {

public static void main(String[] args) {

A a=new A();

a.set(new A());

a=a.set(new A()).get();

a=a.get();

C c=new C();

c=c.setAndGet(new C());

}

}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java 泛型类类型参数 限制

在java泛型中如果对一个泛型类进行类型参数限制,是否此类就不可以被继承了?我试验了下好像不可以,如果不可以我想知道为什么会不可以?跪求大神解答

Java泛型上下限super和extendS的使用区别,谢谢

class DemoF{ public static void printA(Collection<?super Cat> c){ 相同的方法体,例如打印集合} public static void printB(Collection<?extend Animal> c){相同的方法体,例如打印集合} public static void main(String[ ] args){ Collection<?> co = new linkedList<?>() co.add(new Animal(5)); co.add(new Cat(6)); printA(co); printB(co);//请问该两种方法参数泛型即super和extend的使用有何区别?即泛型的上下限定的区别?谢谢亲 } } class Animal{ int age; public Animal(int age){ this.age =age; } } class Cat extends Animal{ int age; public Cat(int age){ this.age =age; } }

关于Java泛型反射问题

public static void main(String[] args) { //告诉编译器我这个集合只能存储String类型的 List<String> col=new ArrayList<String>(); //告诉编译器我这个集合只能存储Integer类型的 List<Integer> col2=new ArrayList<Integer>(); //输出结果为:true //这就是常说的去除,编译后jvm虚拟机不会知道这个集合存储什么类型的值 System.out.println(col.getClass()==col2.getClass()); //看我如何将String存储到集合col2中。 /** * 在运行过程中,jvm根本不知道col2应该存放什么类型的数据,只是我们在编译器中限定了。 * 我们通过反射可以获取list的add方法给col2存储其他类型的数据。如这里就可以将“abc”存放到col2中 * 不明白这里为什么参数一定要是Object.class,不能改为String.class */ try { col2.getClass().getMethod("add", Object.class).invoke(col2, "abc"); System.out.println(col2.get(0)); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } } ``` ``` 为什么这里必须是Object.class了,list里的add是泛型啊。col2.getClass().getMethod("add", Object.class)

问一个Java泛型与类继承的问题

直接上代码了 ``` //DeviceRepository类 public abstract class DeviceRepository<T extends Device> extends DomainRepository<T> //DeviceEventHandler类第一种写法 public abstract class DeviceEventHandler<M extends Device,R extends DeviceRepository<M>> //DeviceEventHandler的子类针对第一种写法的继承 public class DefaultSmartControllerEventHandler extends DeviceEventHandler<SmartController, SmartControllerRepository> //DeviceEventHandler类第二种写法 public abstract class DeviceEventHandler<R extends DeviceRepository<? extends Device>> //DeviceEventHandler的子类针对第二种写法的继承 public class DefaultSmartControllerEventHandler extends DeviceEventHandler<SmartControllerRepository> ``` 这两种写法在Eclipse中都编译通过了,但我不清楚他们之间有什么不同,如果哪位朋友知道请告知我,谢谢。 另外,针对第二种写法,我在DeviceEventHandler中通过R获取的是具体的Device类的对象,而第一种写法似乎可以写成通过R获取M类的对象。

怎么给一个泛型入参限定两种可能性

![图片说明](https://img-ask.csdn.net/upload/201601/04/1451863985_371743.png) ![图片说明](https://img-ask.csdn.net/upload/201601/04/1451864011_471984.png) ![图片说明](https://img-ask.csdn.net/upload/201601/04/1451864033_202423.png) ![图片说明](https://img-ask.csdn.net/upload/201601/04/1451864047_968660.png) ![图片说明](https://img-ask.csdn.net/upload/201601/04/1451864068_549549.png) ![图片说明](https://img-ask.csdn.net/upload/201601/04/1451864077_627379.png) ![图片说明](https://img-ask.csdn.net/upload/201601/04/1451864090_854048.png) public static final String httpsRead( final URL url, final String urlMethod, final Map<String, String> requestProperty, final Map<String, String[]> urlParam) { return httpsRead(url, urlMethod, requestProperty, urlParamToString(urlParam)); }

泛型限定[下限]super的使用报错,大神求解释!!!

``` import java.util.*; class Fan4Demo { public static void main(String[] args) { ArrayList<Person> al = new ArrayList<Person>(); al.add(new Person("Lisi1",1)); al.add(new Person("Lisi2",2)); al.add(new Person("Lisi3",3)); print(al); ArrayList<Student> al2 = new ArrayList<Student>(); al2.add(new Student("XiaoMing1",1)); al2.add(new Student("XiaoMing2",2)); al2.add(new Student("XiaoMing3",3)); print(al2); } public static void print(ArrayList<? super Student> al) //传说中的泛型限定[下限],此处可以传入Student及Student类的父类型 { Iterator<? super Student> it = al.iterator(); while(it.hasNext()) { System.out.println(it.next().getName());//此处报错 } } } class Person { private String name; private int age; Person(String name,int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } class Student extends Person { public Student(String name,int age) { super(name,age); } } ``` ![图片说明](https://img-ask.csdn.net/upload/201501/31/1422669816_183400.png) 说说我的理解吧:? super Student 即:此处 ? 可以是Student类型或是Student类型的父类,那么问题来了,Object也是Student类的父类呀!!!那么.getName()方法就无法调用。但问题又来了,如果是这样的话,那么泛型限定的下限局限性也太大了,直接到了Object级别,自此非Object类的方法统统不能用。。。 这个只是我个人的理解不知道对不对,求大神再此不吝赐教解释下,谢谢!!!

java 类型参数 T extends SelfBounded<T>的T在运行时会被擦除成什么类型

![图片说明](https://img-ask.csdn.net/upload/201508/20/1440067127_311554.jpg) class SelfBounded<T extends SelfBounded<T>> { T element; SelfBounded<T> set(T arg) { element = arg; return this; } T get() { return element; } } 请问类型参数 T extends SelfBounded<T>的T在运行时会被擦除成什么类型

redis使用@Cacheable缓存返回值,发送header【Accept:application/xml】请求返回xml数据异常

使用redis @Cacheable注解缓存数据 用Postman 发送header【Accept:application/xml】请求返回xml数据异常 如果不使用缓存的话以下代码使用没有问题,是不是redis反序列化后得到对象有所差异?value使用 Jackson2JsonRedisSerializer controller代码 ``` @GetMapping("/api/list") @ResponseBody public TableDataInfo apiList(BasicsOperLog operLog) { startPage(); List<BasicsOperLog> list = operLogService.selectOperLogList(operLog); return getDataTable(list); } ``` service代码 ``` @Cacheable(value = "logs",key = "'operLog'") public List<BasicsOperLog> selectOperLogList(BasicsOperLog operLog) { return operLogMapper.selectOperLogList(operLog); } ``` TableDataInfo 代码 ``` @XmlRootElement @XmlAccessorType(XmlAccessType.FIELD) @XmlSeeAlso({BasicsOperLog.class,BaseEntity.class,TableDataInfo.class,Object.class}) public class TableDataInfo implements Serializable ``` Postman 请求 ![图片说明](https://img-ask.csdn.net/upload/201904/22/1555934407_939154.png) 出现以下错误,别人的解决方案就是加XmlSeeAlso ``` 18:58:07.799 [http-nio-8081-exec-2] ERROR c.b.f.w.e.DefaultExceptionHandler - [notFount,49] - 运行时异常: org.springframework.http.converter.HttpMessageNotWritableException: Could not marshal [com.basics.framework.web.page.TableDataInfo@7e682fb1]: null; nested exception is javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: class com.basics.system.domain.BasicsOperLog以及其任何超类对此上下文都是未知的。 javax.xml.bind.JAXBException: class com.basics.system.domain.BasicsOperLog以及其任何超类对此上下文都是未知的。] at org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.writeToResult(Jaxb2RootElementHttpMessageConverter.java:188) at org.springframework.http.converter.xml.AbstractXmlHttpMessageConverter.writeInternal(AbstractXmlHttpMessageConverter.java:71) at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:226) at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:275) at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:180) at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:82) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:119) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:891) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:112) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.basics.common.xss.XssFilter.doFilter(XssFilter.java:66) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: javax.xml.bind.MarshalException: null at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:311) at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236) at org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter.writeToResult(Jaxb2RootElementHttpMessageConverter.java:185) ... 90 common frames omitted Caused by: com.sun.istack.internal.SAXException2: class com.basics.system.domain.BasicsOperLog以及其任何超类对此上下文都是未知的。 at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:232) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:638) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:54) at com.sun.xml.internal.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:157) at com.sun.xml.internal.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:144) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:345) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:578) at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:326) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:479) at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308) ... 92 common frames omitted Caused by: javax.xml.bind.JAXBException: class com.basics.system.domain.BasicsOperLog以及其任何超类对此上下文都是未知的。 at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:567) at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:633) ... 100 common frames omitted 18:58:08.307 [http-nio-8081-exec-2] WARN o.s.w.s.m.m.a.ExceptionHandlerExceptionResolver - [logException,194] - Resolved exception caused by handler execution: org.springframework.http.converter.HttpMessageNotWritableException: Could not marshal [com.basics.framework.web.page.TableDataInfo@7e682fb1]: null; nested exception is javax.xml.bind.MarshalException - with linked exception: [com.sun.istack.internal.SAXException2: class com.basics.system.domain.BasicsOperLog以及其任何超类对此上下文都是未知的。 javax.xml.bind.JAXBException: class com.basics.system.domain.BasicsOperLog以及其任何超类对此上下文都是未知的。] ``` ===================04.24 更新================== 补充分析 在JAXBContextImpl 类的 462行 如下: ``` public final JaxBeanInfo getBeanInfo(Object o) { for(Class c = o.getClass(); c != Object.class; c = c.getSuperclass()) { JaxBeanInfo bi = (JaxBeanInfo)this.beanInfoMap.get(c); if(bi != null) { return bi; } } ``` 这里从 c 不等于 BasicsOperLog.class 发现 class c 缺少了GenericInfo消息,泛型限定类表丢失,类型被擦除,正常的BasicsOperLog.class里面是有的。因此 获取不到 JaxBeanInfo 产出异常。现在就是不晓得为什么反序列化会造成缺少GenericInfo信息 参考:[](https://chenzhihao.cc/archives/375 "")

一个继承的问题,求解答。

package 泛型限定; public class Person { private String name; public Person() { // TODO Auto-generated constructor stub } public Person(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void eat(){ System.out.println("人在吃饭"); } public String toString() { return this.getName(); } } @SuppressWarnings("all") class Student extends Person{ private String name; public Student() { // TODO Auto-generated constructor stub } public Student(String name) { super(); this.name = name; } public void study(){ System.out.println("学生在学习"); } } @SuppressWarnings("all") class Worker extends Person{ private String name; public Worker() { // TODO Auto-generated constructor stub } public Worker(String name) { super(); this.name = name; } public void work(){ System.out.println("工人在工作"); } } /////////////////////// package 泛型限定; import java.util.ArrayList; import java.util.Iterator; public class TextPerson { public static void main(String[] args) { ArrayList<Person> list=new ArrayList<>(); ArrayList<Student> list02=new ArrayList<>(); ArrayList<Worker> list03=new ArrayList<>(); list.add(new Person("汪洋")); list.add(new Person("刘林")); list.add(new Person("张兆年")); list02.add(new Student("学生一")); list02.add(new Student("学生二")); list02.add(new Student("学生三")); list03.add(new Worker("工人一")); list03.add(new Worker("工人二")); list03.add(new Worker("工人三")); paint(list); paint(list02); paint(list03); System.out.println("=============="); paint2(list02); paint2(list); } public static void paint(ArrayList<? extends Person> list){ Iterator<? extends Person> it=list.iterator(); while(it.hasNext()) { System.out.println(it.next().getName()); } } public static void paint2(ArrayList<? super Student> list){ Iterator<? super Student> it=list.iterator(); while(it.hasNext()) { System.out.println(it.next().toString()); } } } /////////////////// 运行结果为: 汪洋 刘林 张兆年 null null null null null null ============== null null null 汪洋 刘林 张兆年 ========= 问题来了,为什么会出现null呢,是我继承的地方有什么没有弄懂吗,求解答!

学Python后到底能干什么?网友:我太难了

感觉全世界营销文都在推Python,但是找不到工作的话,又有哪个机构会站出来给我推荐工作? 笔者冷静分析多方数据,想跟大家说:关于超越老牌霸主Java,过去几年间Python一直都被寄予厚望。但是事实是虽然上升趋势,但是国内环境下,一时间是无法马上就超越Java的,也可以换句话说:超越Java只是时间问题罢。 太嚣张了会Python的人!找工作拿高薪这么简单? https://edu....

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

为什么程序猿都不愿意去外包?

分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助

Java校招入职华为,半年后我跑路了

何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...

Java基础知识面试题(2020最新版)

文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的主类有何不同?Java应用程序与小程序之间有那些差别?Java和C++的区别Oracle JDK 和 OpenJDK 的对比基础语法数据类型Java有哪些数据类型switc...

@程序员:GitHub这个项目快薅羊毛

今天下午在朋友圈看到很多人都在发github的羊毛,一时没明白是怎么回事。 后来上百度搜索了一下,原来真有这回事,毕竟资源主义的羊毛不少啊,1000刀刷爆了朋友圈!不知道你们的朋友圈有没有看到类似的消息。 这到底是啥情况? 微软开发者平台GitHub 的一个区块链项目 Handshake ,搞了一个招募新会员的活动,面向GitHub 上前 25万名开发者派送 4,246.99 HNS币,大约价...

用python打开电脑摄像头,并把图像传回qq邮箱【Pyinstaller打包】

前言: 如何悄悄的打开朋友的摄像头,看看她最近过的怎么样,嘿嘿!这次让我带你们来实现这个功能。 注: 这个程序仅限在朋友之间开玩笑,别去搞什么违法的事情哦。 代码 发送邮件 使用python内置的email模块即可完成。导入相应的代码封装为一个send函数,顺便导入需要导入的包 注: 下面的代码有三处要修改的地方,两处写的qq邮箱地址,还有一处写的qq邮箱授权码,不知道qq邮箱授权码的可以去百度一...

做了5年运维,靠着这份监控知识体系,我从3K变成了40K

从来没讲过运维,因为我觉得运维这种东西不需要太多的知识面,然后我一个做了运维朋友告诉我大错特错,他就是从3K的运维一步步到40K的,甚至笑着说:我现在感觉自己什么都能做。 既然讲,就讲最重要的吧。 监控是整个运维乃至整个产品生命周期中最重要的一环,事前及时预警发现故障,事后提供详实的数据用于追查定位问题。目前业界有很多不错的开源产品可供选择。选择一款开源的监控系统,是一个省时省力、效率最高的方...

C++(继承):19---虚基类与虚继承(virtual)

一、菱形继承 在介绍虚继承之前介绍一下菱形继承 概念:A作为基类,B和C都继承与A。最后一个类D又继承于B和C,这样形式的继承称为菱形继承 菱形继承的缺点: 数据冗余:在D中会保存两份A的内容 访问不明确(二义性):因为D不知道是以B为中介去访问A还是以C为中介去访问A,因此在访问某些成员的时候会发生二义性 缺点的解决: 数据冗余:通过下面“虚继承”技术来解决(见下) 访问...

再不跳槽,应届毕业生拿的都比我多了!

跳槽几乎是每个人职业生涯的一部分,很多HR说“三年两跳”已经是一个跳槽频繁与否的阈值了,可为什么市面上有很多程序员不到一年就跳槽呢?他们不担心影响履历吗? PayScale之前发布的**《员工最短任期公司排行榜》中,两家码农大厂Amazon和Google**,以1年和1.1年的员工任期中位数分列第二、第四名。 PayScale:员工最短任期公司排行榜 意外的是,任期中位数极小的这两家公司,薪资...

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

华为初面+综合面试(Java技术面)附上面试题

华为面试整体流程大致分为笔试,性格测试,面试,综合面试,回学校等结果。笔试来说,华为的难度较中等,选择题难度和网易腾讯差不多。最后的代码题,相比下来就简单很多,一共3道题目,前2题很容易就AC,题目已经记不太清楚,不过难度确实不大。最后一题最后提交的代码过了75%的样例,一直没有发现剩下的25%可能存在什么坑。 笔试部分太久远,我就不怎么回忆了。直接将面试。 面试 如果说腾讯的面试是挥金如土...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

win10暴力查看wifi密码

刚才邻居打了个电话说:喂小灰,你家wifi的密码是多少,我怎么连不上了。 我。。。 我也忘了哎,就找到了一个好办法,分享给大家: 第一种情况:已经连接上的wifi,怎么知道密码? 打开:控制面板\网络和 Internet\网络连接 然后右击wifi连接的无线网卡,选择状态 然后像下图一样: 第二种情况:前提是我不知道啊,但是我以前知道密码。 此时可以利用dos命令了 1、利用netsh wlan...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

女朋友过生日,我花了20分钟给她写了一个代理服务器

女朋友说:“看你最近挺辛苦的,我送你一个礼物吧。你看看想要什么,我来准备。” 我想了半天,从书到鞋子到电子产品最后到生活用品,感觉自己什么都不缺,然后和她说:“你省省钱吧,我什么都不需要。” 她坚持要送:“不行,你一定要说一个礼物,我想送你东西了。” 于是,我认真了起来,拿起手机,上淘宝逛了几分钟,但还是没能想出来缺点什么,最后实在没办法了:“这样吧,如果你实在想送东西,那你就写一个代理服务器吧”...

记一次腾讯面试,我挂在了最熟悉不过的队列上……

腾讯后台面试,面试官问:如何自己实现队列?

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

HTTP与HTTPS的区别

面试官问HTTP与HTTPS的区别,我这样回答让他竖起大拇指!

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

立即提问
相关内容推荐