FQI-I 2019-09-10 16:32 采纳率: 0%
浏览 567

JAVA 怎么限制类型必须有公共无参构造函数?

我想动态创建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里也实现强制子类必须有公共无参构造函数,但不知道怎么实现。

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-09-10 18:02
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大