gpt4 book ai didi

c# - 如何实例化通用类对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:14 25 4
gpt4 key购买 nike

我正在尝试将以下 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;
}
}

当我实例化数据对象时,它不会在运行时获取通用类的属性例如,当我点击代码时,它没有获得 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();
}

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

最佳答案

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

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

实际上是:

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

阅读 Java 泛型教程 wrt。到“type erasure”了解详情。


您需要使用 factory pattern .

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 时为实际的最终类型实现它。

关于c# - 如何实例化通用类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14054463/

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