gpt4 book ai didi

Java Generic - 找不到对象方法

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:45:47 26 4
gpt4 key购买 nike

我的界面如下所示:

package com.sample.service;

import com.sample.model.Request;

public interface Service<T> {
void add(T domain);
<E> boolean update(Request<E> request);
}

Request.java所在

package com.sample.model;

public class Request<E> {
private final E entity;

public Request(E entity) {
this.entity = entity;
}

public E getEntity() {
return entity;
}
}

下面是我的实现

package com.sample.service;

import com.sample.domain.User;
import com.sample.model.Form;
import com.sample.model.Request;

public class UserServiceImpl implements Service<User> {

@Override
public void add(User user) {
System.out.println("add: " + user);
}

@Override
public <Form> boolean update(Request<Form> request) {
System.out.println("update: " + request);
Form form = request.getEntity();
//form.setUsername("some_username");//This line caused compile error
return true;
}
}

这是 Form.java

package com.sample.model;

public class Form {
private String username;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

@Override
public String toString() {
return username;
}
}

和 User.java

package com.sample.domain;

public class User {
private String name;

public String getName() {
return name;
}

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

@Override
public String toString() {
return name;
}
}

当我编译并执行这些代码时,一切都很好。但是,当我取消注释 UserServiceImpl 中注释的行时,出现编译错误

UserServiceImpl.java:19: error: cannot find symbol
form.setUsername("some_username");

我的问题是为什么找不到form对象中的setUsername方法?表单对象是可变的。

最佳答案

在你的代码中

public <Form> boolean update(Request<Form> request)

Form 不是 com.sample.model.Form。相反,它是另一个通用参数,就像

中的 E
<E> boolean update(Request<E> request);

.编译器对 E 一无所知,即使您碰巧给它起的名字与某个真实类的名称一致。关于 E(或同一上下文中的 Form),编译器唯一可以确定的是它是一个 Object 实例。并且 Object 没有任何 getEntity 方法。

如果您有 C++ 背景,那么您正在尝试对模板进行显式特化。但是,Java 泛型不是模板。他们不生成代码。它们只提供一些编译时检查和运行时类型转换(还有一点,但不多)。在 Java 泛型上下文中查找“type erasure”。

要实现更有用的解决方案,您可以尝试确定 update() 的参数必须具有哪种接口(interface)。如果有需要的接口(interface),将其编写为 Java interface 并用作参数类型。如果没有(极少数情况),您仍然可以使用空的 interface 进行标记,但是您需要自己向上转换参数 - 假设 UserServiceImpl 知道传递给什么类型更新()

在以太情况下,update() 中可能不需要泛型。

关于Java Generic - 找不到对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33084131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com