3

我正在尝试将以下 c# 代码转换为 java

abstract class BaseProcessor<T> where T : new()
{
 public T Process(HtmlDocument html)
 {
         T data = new T();

        Type type = data.GetType();
        BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.SetProperty;
        PropertyInfo[] properties = type.GetProperties(flags);
        foreach (PropertyInfo property in properties)
        {
             string value = "test";
             type.InvokeMember(property.Name, flags, Type.DefaultBinder, data, new object[] { value });
        }
 }
}

所以我已经完成了

public class BaseProcessor<T> 
{
   public T Process(String m_doc)
   {
      T data = (T) new BaseProcessor<T>(); // this is not working

      Document doc = Jsoup.parse(m_doc);
      return data;
   }
}

当我实例化数据对象时,它没有在运行时获取 Generic 类的属性,例如,当我点击代码时,它没有获取 DecodeModel 类的属性

IDocProcessor<DecodeModel> p = new DecodeThisProcessor();
return p.Process(doc);


public interface IDocProcessor<T>
{
    T Process(String webresponse);
}

public class DecodeThisProcessor extends BaseProcessor<DecodeModel> implements IDocProcessor<DecodeModel>
{
public void setup();
}

所以请帮助我实例化通用对象数据的正确语法是什么

4

3 回答 3

2

您不能实例化泛型。原因是该类型在运行时不可用Object,但实际上由编译器替换为。所以

T data = new T(); // Not valid in Java for a generics T!

实际上是:

Object data = new Object(); // Obviously not the desired result

阅读 Java 泛型教程 wrt。到“类型擦除”了解详情。


您将需要使用工厂模式

T data = factory.make();

在哪里

public interface Factory<T> {
     T make();
}

需要实现并传递给构造函数。要完成这项工作,您需要一个知道如何实例化所需类的工厂!

一个(相当明显的)变体是将工厂方法放入您的抽象类中。

public abstract class BaseProcessor<T> 
{
   protected abstract T makeProcessor();

   public T Process(String m_doc)
   {
       T data = makeProcessor(); // this is now working!

并在扩展BaseProcessor时为实际的最终类型实现它。

于 2012-12-27T12:23:18.020 回答
1

倒霉; 在 Java 中,整个泛型严格来说是编译时工件,类型参数的实例化在运行时中不存在。通常的解决方法是将 的实例Class作为标记传递,这将允许您反射地创建该类型的对象。这充满了许多陷阱,但这是您在 Java 中可以得到的最好的。

于 2012-12-27T12:14:00.523 回答
0

你可以这样做:

public class BaseProcessor<T>
{
    private Class<T> clazz;

    public BaseProcessor(Class<T> clazz)
    {
        this.clazz = clazz;
    }

    public T Process(String m_doc)
    {
         T data = clazz.newInstance()
         Document doc = Jsoup.parse(m_doc);
         return data;
    }
}

提示:确保 T 有一个无参数构造函数。

于 2012-12-27T12:10:50.200 回答