fan1472rr
FQI-I
采纳率0%
2019-09-10 16:32 阅读 462

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条回答 默认 最新

相关推荐