【问题标题】:Create java method that only accepts non-abstract Class types创建只接受非抽象类类型的java方法
【发布时间】:2020-09-14 11:58:58
【问题描述】:

在Java中,是否可以创建一个接受所有非抽象类类型的方法/签名?

有点像这样:

public Object getInstance(Class<? extends ConcreteClassSuperType> someNonAbstractClass){
  //some logic that can safely assume that the Class object is not an interface type nor an abstract class
}

其中ConcreteClassSuperType 只是为了说明我的意图而虚构的类型。使用? extends Objecthere 并不能解决问题。

阐述: 在手头的情况下,问题更具体一点,因为我的签名不必接受 ALL 具体类,而只接受那些实现某些接口的类,即我试图创建一个接受类的签名implements MyInterface 的类的类型。所以可以通过MyClass.class,其中MyClass implements MyInterface。出现了两个问题:

  1. 签名还将接受 MyInterface.class(因为泛型 Class&lt;? extends MyInterface&gt; 不是严格的上限)
  2. 可以传递extends MyInterface的另一个接口的类类型。

【问题讨论】:

  • 不,这是不可能的。你能解释一下为什么需要这个吗?如果您可以展示更大的图景,可能还有另一种解决方案。
  • 接受MyInterface有什么问题?该方法究竟应该做什么?
  • 我认为可以直接在方法内部进行检查,如果检查失败则抛出异常。我认为,您可以轻松确定给定类是接口还是抽象类。比如:if (clz == null || clz.isInterface() || Modifier.isAbstract(clz.getModifiers())) { throw new IllegalArgumentException();}
  • 好吧,不是什么超级具体的东西,只是我在考虑如何创建一些框架或库,使创建带有引用方法的注释成员的注释成为可能/容易- MyAnnotation(delegate=MyClass::myMethod) 是不可能的。一个人必须传递一个字符串(以某种客户格式,包括 FQCN 和参数),或者可能使用一些类(比如我正在考虑的 SAM 的实现)。不知何故,这让我想到了上述问题。但感谢 cmets/answers。
  • 反思。但前提是你知道自己在做什么。

标签: java class generics abstract signature


【解决方案1】:

因为类可以有多个参数,所以我认为首先检查类是否具体然后实现一种方法来实例化它会更容易。喜欢,

public <T> boolean isConcrete(Class<T> c) {

    if (c.isInterface() || (c.getModifiers() & Modifier.ABSTRACT) == Modifier.ABSTRACT)
        return false;

    return true;
}

希望这会有所帮助。

编辑

抱歉,刚刚在另一条评论中注意到您可以简化此操作...

public <T> boolean isConcrete(Class<T> c) {

    if (c.isInterface() || Modifier.isAbstract(c.getModifiers()))
            return false;

    return true;
}

【讨论】:

  • 您可以进一步优化它。只需否定条件并返回它
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 2022-01-22
  • 1970-01-01
  • 2012-09-16
  • 2013-12-03
  • 2012-11-19
相关资源
最近更新 更多