问题的标题听起来像一个很好的思想实验。可悲的是,事实并非如此。让我们假设以下代码结构:
class Outer {
private static class Inner implements SomeInterface {
...
}
public static SomeInterface returnInner() {
return new Inner();
}
}
是否有良好,干净的方式执行以下检查:
SomeInterface a = A.returnInner();
if (a instanceof Outer.Inner)
throw new Error("Ooops, something bad happened");
您认为这不是一个真实的例子吗?检查Arrays
类和方法asList(T ...)
,它返回自己的List<T>
实现,恰好是private static class ArrayList<T>
(与通常的{{1}无关感谢Sun和Oracle,没有你我会做什么。我需要检查传递给我的方法的对象是否不是这个包装类的实例,因为它没有实现ArrayList
方法(它使用add()
的实现 - 它抛出一个{{ 1}})。
答案 0 :(得分:2)
真的没有好办法检查吗?即使通过一些反思魔法?
有一种方法,但无论如何都不是一个好方法:
// WARNINIG: This is very fragile, please try avoiding code like this.
if (theirList.getClass().getEnclosingClass() != null) {
// theirList is an instance of an inner class
}
问题不是很难做到,而是结果变得非常不可靠:
List<T>
的可变实现 - 例如,如果您决定推出自己的实现List<T>
的嵌套类,则会被拒绝由于这些原因,最好尝试添加到类中,捕获异常,并采取当调用者传递给您只读列表时要采取的任何替代方法。
答案 1 :(得分:0)
这是一个可怕的,肮脏的,容易出错的练习,但你可以检查课程&#39;名称。内在的类名是封闭的类&#39;名称后跟$
和内部班级&#39;名称。在这种情况下:
SomeInterface instance = Outer.returnInner();
if (instance.getClass().getName().equals(Outer.class.getName() + "$Inner")) {
throw new RuntimeException("Ooops, something bad happened");
}