gpt4 book ai didi

Java 转换接口(interface)但使用对象方法

转载 作者:行者123 更新时间:2023-11-29 04:31:07 25 4
gpt4 key购买 nike

我有一个关于在通过接口(interface)实例化时如何调用对象基础成员的问题。

假设我在尝试构建的框架中有以下接口(interface)和具体类:

public interface UsedClass {
public boolean getBool();
}

public class User implements UsedClass {

private String userName;
private String userRole;
public User(String userName, String userRole){
this.userName = userName;
this.userRole = userRole;
}
public boolean getBool() {
// some code
}
public int getUserName() {
return userName;
}
public int getUserRole() {
return userRole;
}

还有一个实现类:

public class Run implements UsedClass {        
private String runName;
private int runNumber;
public Run(String runName, int runNumber){
this.runName = runName;
this.runNumber = runNumber;
}
public boolean getBool() {
// some code
}
public String getRunName() {
return runName;
}
public int getRunNumber() {
return runNumber;
}
}

但是我不能将方法 getRunName()getUserRole() 放入接口(interface)中!

最终目标是创建一个 FactoryClass 来处理从数据库 GUI 传递的对象。

我想知道是否有更好的方法然后使用类引用能够安全地调用 Run 或 User 的方法,例如:

public class EntityFactory {
public static Object getValueAt(int rowIndex, int columnIndex, UsedClass usedClass) {
if (usedClass.getClass().getSimpleName().equals("User")) {

switch (columnIndex) {
case 0:
return ((User) usedClass).getUserName();
case 1:
return ((User) usedClass).getUserRole();
default:
return null;
}
} else if (usedClass.getClass().getSimpleName().equals("Run")) {
switch (columnIndex) {
case 0:
return ((Run) usedClass).getRunName();
case 1:
return ((Run) usedClass).getRunNumber();
default:
return null;
}
}

我已经阅读了几篇 SO 帖子 type casting when objects are of interface references in JavaJava cast interface to class

暗示不建议引用转换,但由于我不能将所有方法都放入接口(interface)中,有什么建议?

最佳答案

static interface ColumnSource<T> {
String getColumn(T value, int index);
}
static Map<Class, ColumnSource> map = new HashMap();
static {
map.put(User.class, new UserNameAndRoleSource<User>() {
public String getColumn(User user, int index) {
switch (index) {
case 0: return user.getUserName();
case 1: return user.getUserRole();
default: throw new RuntimeException();
}
}
});
map.put(Run.class, new ColumnSource<Run>() {
public String getColumn(Run run, int index) {
switch (index) {
case 0: return run.getRunName();
case 1: return run.getRunNumer();
default: throw new RuntimeException();
}
}
});
}
public static Object getValueAt(int rowIndex, int columnIndex, Object o) {
Class type = o.getClass();
ColumnSource source = map.get(type);
if (source == null) throw new RuntimeException(type.getName() + " not supported");
return source.getColumn(o, columnIndex);
}

关于Java 转换接口(interface)但使用对象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43760125/

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