Java 如何强制用户提交从基类继承的类?

Java 如何强制用户提交从基类继承的类?,java,Java,假设我们有一个抽象方法,该方法应该返回Class: abstract class MainClass{ abstract Class onCreateClass(); } abstract class MainClass{ abstract Class<BaseClass> onCreateClass(); } 我实现了如下类: class ChildClass extends MainClass{ @Override Class onCreate

假设我们有一个抽象方法,该方法应该返回
Class

abstract class MainClass{
    abstract Class onCreateClass();
}
abstract class MainClass{
    abstract Class<BaseClass> onCreateClass();
}
我实现了如下类:

class ChildClass extends MainClass{
    @Override
    Class onCreateClass() {
        return AnotherClass.class;
    }
}
class AnotherClass {

}
它工作得很好,但现在我想在另一个类上声明一些约束。例如,我想强制
MainClass
的用户实现
onCreateClass
,这样它只返回从
基类继承的类:

abstract class MainClass{
    abstract Class onCreateClass();
}
abstract class MainClass{
    abstract Class<BaseClass> onCreateClass();
}
你可以选择:

abstract class MainClass <T extends BaseClass> {
  abstract Class<T> onCreateClass();
}
抽象类MainClass{
抽象类onCreateClass();
}
现在你要么去

class ChildClass extends MainClass<SomeSpecificClassExtendingBase> {
  class<SomeSpecificClassExtendingBase> onCreateClass() {
    return AnotherClass.class;
  }
class子类扩展了main类{
类onCreateClass(){
返回另一个class.class;
}

class子类扩展了main类{
换句话说:您可以表达泛型类型的某些约束,这是一个更简单的示例,说明了如何实现这一点。您可能想进一步阅读或(硬核)。

您选择:

abstract class MainClass <T extends BaseClass> {
  abstract Class<T> onCreateClass();
}
抽象类MainClass{
抽象类onCreateClass();
}
现在你要么去

class ChildClass extends MainClass<SomeSpecificClassExtendingBase> {
  class<SomeSpecificClassExtendingBase> onCreateClass() {
    return AnotherClass.class;
  }
class子类扩展了main类{
类onCreateClass(){
返回另一个class.class;
}

class子类扩展了main类{

换句话说:您可以表达泛型类型的某些约束,这是如何实现这一点的一个简单示例。您可能想进一步阅读或(硬核)。

您可以在
声明中使用泛型通配符:

abstract class MainClass{
    abstract Class<? extends BaseClass> onCreateClass(); <-- all classes extends BaseClass
}

class ChildClass extends MainClass{
    @Override
    Class<AnotherClass> onCreateClass() { <-- compilation valid
        return AnotherClass.class;
    }
}


class AnotherClass extends BaseClass {

}

private class BaseClass {
}


class SecondChildClass extends MainClass{
    @Override
    Class<SecondAnotherClass> onCreateClass() { <-- compilation failed
        return SecondAnotherClass.class;
    }
}

private class SecondAnotherClass {
}
抽象类MainClass{

抽象类您可以在
Class
声明中使用通用通配符:

abstract class MainClass{
    abstract Class<? extends BaseClass> onCreateClass(); <-- all classes extends BaseClass
}

class ChildClass extends MainClass{
    @Override
    Class<AnotherClass> onCreateClass() { <-- compilation valid
        return AnotherClass.class;
    }
}


class AnotherClass extends BaseClass {

}

private class BaseClass {
}


class SecondChildClass extends MainClass{
    @Override
    Class<SecondAnotherClass> onCreateClass() { <-- compilation failed
        return SecondAnotherClass.class;
    }
}

private class SecondAnotherClass {
}
抽象类MainClass{

abstract Classis
class MainClass
java的有效语法?@VladBochenin我还没有喝早餐咖啡。你说得对。修复了!谢谢!很高兴看到27k+用户也会犯错;P@Fildor这是有目的的,以便社区中声誉较低的成员获得他们的“我可以在这里做出重大贡献”很抱歉,这一行
class-ChildClass-extends-MainClass{
也有错误(未知类T)。应该与
class-ChildClass-extends-MainClass类似{
class MainClass
java语法有效吗?@VladBochenin我还没有喝早餐咖啡。你说得对。修复了!谢谢!很高兴看到27k+用户也会犯错;P@Fildor这是有目的的,以便社区中声誉较低的成员获得他们的“我可以在这里做出重大贡献”很抱歉,这一行
class-ChildClass-extends-MainClass{
也有错误(未知类T)。应该像
class-ChildClass-extends-MainClass{