찾다

 >  Q&A  >  본문

java - 关于泛型和反射的代码错误(cannot select from a type variable)

问题1:
想写个requestInfo的toString方法,把所有的成员变量都打印出来,子类就不用每次都写个toString方法了,但是父类怎么获取子类成员变量的值?

public class RequestInfo
{
    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        Field[] fields = this.getClass().getDeclaredFields();
        for(Field field : fields)
        {
            sb.append(field.getName(), " = ", (这里怎么获取属性值?), ";");
        }
        return "";
    }
}

问题2
下面那个类P怎么实例化,也没懂错误的原因,用P.getClass()还是不行

public abstract class AbstractService<Q extends RequestInfo, P extends ResponseInfo>
{
    public static final Logger LOGGER = LoggerFactory.getLogger(AbstractService.class);

    private String logTag;

    private P respBean;

    public P execute(Q reqBean)
    {
        init();
        LOGGER.info(StringUtil.appendStr("Request : {}, req = {}", logTag, reqBean.toString()));

        try
        {
            if (checkInput(reqBean))
            {
                handle(reqBean, respBean);
            }
            else
            {
                throw new Exception(StringUtil.appendStr(logTag, " check input param invalid"));
            }
        }
        catch (Exception e)
        {
            LOGGER.error(StringUtil.appendStr(logTag, " Exception: "), e);
        }
        return respBean;
    }

    protected void init()
    {
        logTag = getClass().getSimpleName();
        respBean =P.class.newInsance();//这里报错,cannot select from a type variable
    }

    protected boolean checkInput(Q reqBean)
    {
        return true;
    }

    protected abstract void handle(Q reqBean, P respBean)
            throws Exception;
}
迷茫迷茫2807일 전1187

모든 응답(3)나는 대답할 것이다

  • PHPz

    PHPz2017-04-18 10:53:04

    컴파일 후 제네릭이 지워졌습니다. 이는 역사적 이유로 인해 제네릭 정보를 전혀 볼 수 없기 때문에 언급한 p.getClass가 존재할 수 없습니다.

    첫 번째 질문은 좋은 생각이지만 제가 아는 한 객체는 하위 클래스의 상태를 알 수 없습니다. Java의 다형성 메커니즘은 상위 클래스 또는 상위 클래스에서만 학습할 수 있습니다. 인터페이스의 메소드

    첫 번째 질문은 하위 클래스의 toString 메서드가 상속 후 실행되면 자신의 this도 호출될 것이라고 생각하기 때문에 하위 클래스의 멤버 변수를 얻을 수 있다고 생각하는 것 같습니다. 잘못된. 런타임 시 jvm은 상위 클래스의 객체 공간에서 이 메소드를 가져와 실행합니다. 따라서 어찌됐든 상위 클래스의 멤버 변수일 뿐입니다

    위 이탤릭체 부분에 실수가 있었습니다. IDE를 실행하여 테스트해 본 결과, 이전에 제가 이해한 내용이 틀렸다는 것을 알게 되었습니다. 질문자에게 폐를 끼치지 않았으면 좋겠습니다.
    아래에 게시된 코드는 루프를 통해 하위 클래스에서 상위 클래스까지 모든 변수를 가져올 수 있습니다. 이것이 도움이 되기를 바랍니다

    으아악

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:53:04

    반성 도구 수업

    으아악

    질문 1

    으아악

    질문 2

    으아악

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:53:04

    첫 번째 문제는 commons-beanutils를 사용하여 해결할 수 있습니다.

    회신하다
    0
  • 취소회신하다