如何投射 List能够调用各个对象的特定方法?

发布于 2024-11-28 11:14:45 字数 980 浏览 4 评论 0原文

我对 List 的通用转换有一些想法,但老实说,我不知道是否可以实现。

我的应用程序中有这个代码片段

public String getObjectACombo() {
   List<ObjectA> listA = theDAO.getObjectA();
   String combo = getCombo(listA, "rootA"); // --> This line
}

public String getObjectBCombo() {
   List<ObjectB> listB = theDAO.getObjectB();
   String combo = getCombo(listA, "rootA"); // --> This line
}

首先,我正在为“-->此行”提到的行编写一些例程。但这两种方法具有完全相同的算法来从 List 生成 JSON 字符串。已从数据库返回。所以我想用通用方法 getCombo(Listlist, String root) 替换它们。但问题是我无法让它发挥作用。

public <T> String getCombo(List<T> list, String root) {
   Iterator<T> listItr = list.iterator();

   ...
   while ( listItr.hasNext() ) {
      jsonObj.put(list.get(i).toJson());  // --> The Error line
   }
}

错误发生在“错误行”。 ObjectA.java 和 ObjectB.java 中都有 toJson() 方法,但在上述行中“未定义类型 T 的方法 toJson()”。

我尝试用 (T) 和 Class.forName() 来转换它,但它们都不起作用。

有解决这个问题的方法吗?有可能吗?

I'm having something in my mind about generic casting for List, but honestly I don't know if it's possible to implement or not.

There is this code snippet in my application

public String getObjectACombo() {
   List<ObjectA> listA = theDAO.getObjectA();
   String combo = getCombo(listA, "rootA"); // --> This line
}

public String getObjectBCombo() {
   List<ObjectB> listB = theDAO.getObjectB();
   String combo = getCombo(listA, "rootA"); // --> This line
}

Firstly I was coding some routine for the lines mentioned as "--> This line". But the two methods have the exact same algorithm to generate JSON string from List<?> which has been returned from the database. So I am thinking to replace them with a generic method, getCombo(List<T> list, String root). But the thing is I couldn't mange to make it work.

public <T> String getCombo(List<T> list, String root) {
   Iterator<T> listItr = list.iterator();

   ...
   while ( listItr.hasNext() ) {
      jsonObj.put(list.get(i).toJson());  // --> The Error line
   }
}

The error happens of the "The Error line". Both ObjectA.java and ObjectB.java have the toJson() method in them, but "The method toJson() is undefined for the type T" at the mentioned line.

I tried to cast it with (T) and Class.forName(), but neither of them had worked.

Is there any work around to this problem? Is it even possible?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

人疚 2024-12-05 11:14:45

使用定义 toJson() 方法的接口,例如 Jsonable :) - 然后限制 T

public <T extends Jsonable> String getCombo(List<T> list, String root) { 
 ...
}

这样编译器就知道每个 < code>T 必须继承自 Jsonable,因此具有 toJson() 方法。

编辑:这是我的意思的一个示例,使用已经存在的 Comparable 接口:

public <T extends Comparable<T>> boolean compare(List<T> list, T other) {
  for( T object : list ) {
    if( object.compareTo( other ) == 0 ) {
      return true;
    }
  }    
  return false;
}

compare( new ArrayList<String>(), "foo"); //compiles, since String implements Comparable<String>
compare( new ArrayList<Object>(), null); //doesn't compile, since Object doesn't implement Comparable<Object>

Use an interface that defines the toJson() method, e.g. Jsonable :) - and then restrict T:

public <T extends Jsonable> String getCombo(List<T> list, String root) { 
 ...
}

This way the compiler knows that each T must inherit from Jsonable and thus has the toJson() method.

Edit: here's an example of what I mean, using the already existing Comparable<T> interface:

public <T extends Comparable<T>> boolean compare(List<T> list, T other) {
  for( T object : list ) {
    if( object.compareTo( other ) == 0 ) {
      return true;
    }
  }    
  return false;
}

compare( new ArrayList<String>(), "foo"); //compiles, since String implements Comparable<String>
compare( new ArrayList<Object>(), null); //doesn't compile, since Object doesn't implement Comparable<Object>
遮了一弯 2024-12-05 11:14:45

尝试对每个使用 a :

public <T> String getCombo( List<T> list, String root )
{
    for (T x : list)
    {
        //do stuff here
    }
}

Try to use a for each:

public <T> String getCombo( List<T> list, String root )
{
    for (T x : list)
    {
        //do stuff here
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文