【发布时间】: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。出现了两个问题:
- 签名还将接受
MyInterface.class(因为泛型Class<? extends MyInterface>不是严格的上限) - 可以传递
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