我正在开发一个应用程序,一种设计方法涉及对instanceof操作员的极大使用.虽然我知道OO设计通常会试图避免使用instanceof,但这是一个不同的故事,这个问题纯粹与性能有关.我想知道是否有任何性能影响?是这么快==吗?
例如,我有一个包含10个子类的基类.在一个获取基类的函数中,我会检查该类是否是子类的实例并执行一些例程.
我想解决它的另一种方法是使用"type id"整数原语,并使用位掩码来表示子类的类别,然后只需对子类"type id"进行掩码比较.表示类别的常量掩码.
被instanceof莫名其妙地由JVM优化得比较快?我想坚持使用Java,但应用程序的性能至关重要.如果之前一直走在这条路上的人可以提供一些建议,那将会很酷.我是在挑剔太多还是专注于错误的事情来优化?
我了解到Java有instanceof运营商.你能详细说明它的使用地点和优势吗?
让clazz一些Class和obj一些Object.
是
clazz.isAssignableFrom(obj.getClass())
Run Code Online (Sandbox Code Playgroud)
总是一样的
clazz.isInstance(obj)
Run Code Online (Sandbox Code Playgroud)
?
如果没有,有什么区别?
我有一个Class对象.我想确定Class对象表示的类型是否实现了特定的接口.我想知道如何实现这一目标?
我有以下代码.基本上它的作用是获取指定包中所有类的数组.然后我想通过数组并将实现接口的Class对象添加到我的地图中.问题是isInstance()将对象作为参数.我无法实例化一个接口.所以我对此感到很茫然.有任何想法吗?
Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
if(clazz.isInstance(/*Some object*/)) //Need something in this if statement
{
retVal.put(clazz.getSimpleName(), clazz);
}
}
Run Code Online (Sandbox Code Playgroud) 如果我创建一个通用的java类,例如:
public class Foo<T>
Run Code Online (Sandbox Code Playgroud)
如何确定那个类的内部,'T'到底是什么?
public ???? Bar()
{
//if its type 1
// do this
//if its type 2
// do this
//if its type 3
// do this
//if its type 4
// do this
}
Run Code Online (Sandbox Code Playgroud)
我已经开始使用Java API并使用Reflection的东西,instanceof,getClass,.class等,但我似乎无法对它们做出正面或反面.我觉得我很接近,只需要结合一些电话,但不断提出来.
更具体地说,我试图确定该类是否使用3种可能类型之一进行实例化.
我希望我BallUserInterfaceFactory返回一个具有正确泛型类型的用户界面的实例.我被困在下面的例子中得到错误:
绑定不匹配:BallUserInterfaceFactory类型的泛型方法getBaseballUserInterface(BASEBALL)不适用于参数(BALL).推断类型BALL不是有界参数的有效替代
public class BallUserInterfaceFactory {
public static <BALL extends Ball> BallUserInterface<BALL> getUserInterface(BALL ball) {
if(ball instanceof Baseball){
return getBaseballUserInterface(ball);
}
//Other ball types go here
//Unable to create a UI for ball
return null;
}
private static <BASEBALL extends Baseball> BaseballUserInterface<BASEBALL> getBaseballUserInterface(BASEBALL ball){
return new BaseballUserInterface<BASEBALL>(ball);
}
}
Run Code Online (Sandbox Code Playgroud)
我知道它不能保证BALL是一个棒球,因此getBaseballUserInterface方法调用中存在参数类型不匹配.
如果我在getBaseballUserInterface方法调用中转换ball参数,那么我得到错误:
类型不匹配:无法转换
BaseballUserInterface<Baseball>为BallUserInterface<BALL>
因为它不能保证我返回的是同一类型的BALL.
我的问题是,处理这种情况的策略是什么?
(为了完整性,这里是示例中所需的其他类)
public class Ball {
}
public class Baseball extends Ball {
}
public class BallUserInterface <BALL extends Ball> {
private …Run Code Online (Sandbox Code Playgroud) 我很好奇地问这个,也许这是毫无意义的.
当我们在java中使用instanceof时,如:
if (a instanceof Parent){ //"Parent" here is a parent class of "a"
}
Run Code Online (Sandbox Code Playgroud)
为什么我们不能使用如下:
if (a instanceof Parent.class){
}
Run Code Online (Sandbox Code Playgroud)
从严格编程的角度来看,第二个'instanceof'是否更有意义?"Parent"和"Parent.class"有什么区别?
我想动态地判断Java中的Object是否为数字.我的代码如下:
if(obj.getClass().equals(Number.class)) {
attributeTypeStr = "Numeric";
} else {
attributeTypeStr = "Non-Numeric";
}
Run Code Online (Sandbox Code Playgroud)
该Object obj可以是任何数值类型,如Integer, Float, Double等,但是,当我与测试它Integer/Float/Double,则attributeTypeStr总是返回"Non-Numeric".我想这是因为Integer/Float/Double是子类Number但Number.class不相等Double.class.我可以用类似的东西
if(obj.getClass().equals(Integer.class) || obj.getClass().equals(Float.class) || obj.getClass().equals(Double.class))
Run Code Online (Sandbox Code Playgroud)
但它看起来太冗长了.那么有一个简单的方法吗?
我的项目中有一位同事,他深深反对instanceof运营商的使用,因为它"产生了大量的开销",原因是什么?这是真的吗?
有没有其他方法来检查对象的类型而不是使用它?
因为我发现它在某些场合非常有用.
java ×10
instanceof ×3
casting ×2
generics ×2
reflection ×2
c# ×1
class ×1
inheritance ×1
operators ×1
optimization ×1
performance ×1