我试图从返回的对象 obj
访问方法 GetDatbaseName()
,但它返回错误,表明该方法不可用。
但是,当我对 obj
进行类型转换时,它正在工作。
String name = ((Oracle)obj).GetDatabaseName();
如何处理这个泛型?就像我无法对 Oracle 和 MongoDB 等每种返回类型进行类型转换。还有更好的实现吗?
// one class needs to have a main() method
public class HelloWorld
{
// arguments are passed using the text field below this editor
public static void main(String[] args)
{
Data dt = new Data("Oracle");
Object obj = dt.GetObject();
String name = obj.GetDatabaseName();
System.out.println(name);
}
}
public class Data
{
public String _type;
public Data(String type)
{
_type = type;
}
public Object GetObject()
{
Object obj = null;
switch(_type)
{
case("Oracle"):
obj = new Oracle("Test");
break;
case("MongoDB"):
obj = new MongoDB("TestCollection");
break;
}
return obj;
}
}
public class Oracle
{
public String _databaseName;
public Oracle(String databaseName)
{
_databaseName = databaseName;
}
public String GetDatabaseName() { return _databaseName; }
}
public class MongoDB
{
public String _collectionName;
public MongoDB(String collectionName)
{
_collectionName = collectionName;
}
public String GetCollectionName() { return _collectionName; }
}
最佳答案
有两种方法可以解决这个问题,第一种是使用通用 class
,而第二个使用 interface
,如果您知道类将具有相同的方法,则第二种方法更好,而通用方法是类具有不同的方法
通用方法
public class DBtest{
public static void main(String[] args){
DataBase<Oracle> database = new DataBase<>(Oracle.class);
Oracle oracle = database.getDataBase();
System.out.println(oracle.getDatabaseName());
}
}
class DataBase<T>{
private T database;
public DataBase(Class<T> classOfT){
try {
database = classOfT.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public T getDataBase(){
return database;
}
}
class Oracle{
private String _databaseName;
public Oracle(){
_databaseName = "test";
}
public String getDatabaseName() { return _databaseName; }
}
如您所见,无法定义数据库名称,您可以编写 <T extends Name>
这是一个具有 getName()
的接口(interface)和setName()
方法
界面方法
public class DBtest{
// arguments are passed using the text field below this editor
public static void main(String[] args){
DataBase database = new DataBase(new Oracle("test"));
DatabaseName databaseName = database.getDataBase();
System.out.println(databaseName.getName());
}
}
interface DatabaseName {
String getName();
}
class DataBase{
private DatabaseName databaseName;
public DataBase(DatabaseName databaseName){
this.databaseName = databaseName;
}
public DatabaseName getDataBase(){
return databaseName;
}
}
class Oracle implements DatabaseName {
private String _databaseName;
public Oracle(String name){
_databaseName = name;
}
public String getName() {
return _databaseName;
}
}
class MongoDB implements DatabaseName {
private String _databaseName;
public MongoDB(String name){
_databaseName = name;
}
public String getName() {
return _databaseName;
}
}
显然DatabaseName
对于接口(interface)来说是一个坏名字,但它是两个类唯一相同的方法,因此这样调用它是有意义的。接口(interface)的伟大之处在于你不必关心什么 class
只要您知道方法名称就可以使用。
关于java - 方法在通用返回对象中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48567010/