我想动态创建T类型对象,
C#中可以通过 class A where T :new()
来限制 T类型必须要有公共无参构造函数,java里怎么做到这种限制?
补充,下面是C#代码:
public abstract class RegisterLoader<T>
where T : RegisterLoader<T>, new()
{
public abstract void Register(List<Type> registerList);
}
public class RegisterTest1 : RegisterLoader<RegisterTest1>
{
public override void Register(List<Type> registerList)
{
// 注册一些类型;
registerList.Add(typeof(RegisterTest1));
}
}
//public class RegisterTest2 : RegisterLoader<RegisterTest2>
//{
// public RegisterTest2(int a) { } // Compile Error: RegisterTest2必须具有公共无参构造函数.
// public override void Register(List<Type> registerList)
// {
// // 注册一些类型;
// }
//}
public class RegisterFactory
{
static readonly HashSet<Type> RegTypesSet = new HashSet<Type>();
public static void RegisterFromConfig(string configPath)
{
#if DEBUG
Type[] loaders = new Type[]
{
typeof(RegisterTest1)
};
#else
// 读取配置文件,从配置文件里获取各dll里的RegisterLoader子类
Type[] loaders = ConfigHelper.GetResTypeConfig(configPath);
#endif
foreach (var t in loaders)
{
dynamic loader = Activator.CreateInstance(t);
List<Type> regTypes = new List<Type>();
loader.Register(regTypes);
RegisterTypes(regTypes);
}
}
private static void RegisterTypes(List<Type> types)
{
lock (RegTypesSet)
{
foreach (var t in types)
{
RegTypesSet.Add(t);
}
}
}
}
RegisterLoader泛型的约束 T:RegisterLoader,new()
强制 T 必须是RegisterLoader的子类且必须包含公共无参构造函数。
如果子类没有公共无参构造函数,编译会报错(例如,RegisterTest2)。
我想在java里也实现强制子类必须有公共无参构造函数,但不知道怎么实现。