标签: instanceof

是否可以使用instanceof运算符来实现两个并行的函数和参数层次结构?

在以下上下文中使用instanceof运算符是不好的做法吗?

public interface IWriter {
    public abstract void write(Dto dto);
}

public abstract class Dto {
    private long id;
    public void setId(long id) {this.id = id;}
    public long getId() {return id;}
}

public class DtoA extends Dto {
   ...
}

public class DtoB extends Dto {
   ...
}

public class MyWriterA implements IWriter {
   @Override
   public void writer(Dto dto) {
     if (!(dto instanceof DtoA))
        return;
     ...
   }
}

public class MyWriterB implements IWriter {
   @Override
   public void writer(Dto dto) { …
Run Code Online (Sandbox Code Playgroud)

java instanceof

5
推荐指数
2
解决办法
278
查看次数

编写Java库以有条件地处理输入类,而不会对该类造成无条件的运行时依赖性

我有一个看似棘手的Java库任务.

我需要编写一个适配器/辅助类来处理JTable具有一些附加功能的s,如果它JTable是a JXTable.但我不想在swingx-core-1.6.2.jar上添加运行时依赖,除非我的应用程序实际使用JXTable(在这种情况下它已经要求在类路径上有SwingX jar文件)

如何解耦我的代码来实现这一目标?我甚至不知道如何测试JXTable; 如果我尝试instanceof JXTable用作测试,这意味着我的代码已经对JXTable具有无条件的运行时依赖性.

我之前编写的Java库有"可选"的运行时链接依赖项:如果我在我的库中有这个:

package com.foobar.foolib;

// import from whizbang.jar
import com.whizbang.BloatwareThingy;

public class SuperObject
{
    /* ... uses a BloatwareThingy ... */
}
Run Code Online (Sandbox Code Playgroud)

并且SuperObject是唯一使用whizbang.jar的类,然后只要我的最终应用程序不使用SuperObject,那么就没有运行时依赖于whizbang.jar; 如果我的最终应用程序确实想要使用SuperObject,那么它需要在类路径中包含whizbang.jar.从应用的角度来看是可选的.效果很好.

如何编写一个方法来测试给定的JTable是否为JXTable的实例,如果应用程序仅使用JTable,则不需要依赖SwingX jar文件?

java dependencies jar instanceof classpath

5
推荐指数
2
解决办法
408
查看次数

Java继承并避免不断使用instanceof

我有三个类,一个抽象用户和两个特定的:NormalUser,它包含一个或多个Address对象的ArrayList,可以是不同的(国内,国际,自定义等),然后是Admin类,它有一个返回true的方法.它们都包含更多彼此无关的方法.

abstract class User{
    public User(String username, String pw){
 ...

}

public class NormalUser extends User{
...
    private ArrayList<Address> addresses;

...

    public void addAdress(ArrayList<Address> address){
        addresses.addAll(address);
}

public class Admin extends User{

...
    public boolean getIsAdmin(){
        return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在在另一个类中,如果我像这样制作4个用户对象:

    ArrayList<User> users;

    users.add(new NormalUser( "1", "pw");
    users.add(new NormalUser( "2", "pw");
    users.add(new NormalUser( "3", "pw");
    users.add(new NormalUser( "4", "pw");
    users.add(new Admin("5", "pw"));
    users.add(new NormalUser( "6", "pw");
Run Code Online (Sandbox Code Playgroud)

并说我想在NormalUser中使用addAddress方法,然后我必须将用户中的specfic用户向下转换为NormalUser,然后才能在NormalUser中使用addAddress方法,如下所示:

     if (user instanceof NormalUser){
        NormalUser normal = (NormalUser) user;
        normal.addAddress(...)
        }
Run Code Online (Sandbox Code Playgroud)

我希望NormalUser和Admin都成为用户的原因是我可以在登录时一起处理它们.

我想到将addEmail添加到User类,然后在NormalUser类中重写它,但是我必须为NormalUser类中的每个方法执行此操作,而且Admin也会从User继承它,当它不需要时功能. …

java inheritance arraylist instanceof

5
推荐指数
1
解决办法
1144
查看次数

instanceof vs isInstance()

class A{

    public A(){
        System.out.println("in A");
    }
}

public class SampleClass{

    public static void main(String[] args) {
        A a = new A();

        System.out.println(A.class.isInstance(a.getClass()));
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

false
Run Code Online (Sandbox Code Playgroud)

为什么这是假的?双方A.classa.getClass()不能返回相同的类!

在哪种情况下我们会从isInstance()方法中得到真实的结果?

java instanceof isinstance

5
推荐指数
1
解决办法
5048
查看次数

instanceof - Stoyan Stefanov在面向对象的javascript中的javascript不一致

Stoyan Stefanov的书"面向对象的javascript"中,他在第103页上有以下内容.但是,当我尝试这个时,我会得到一个不同的结果h instanceof Object.我错过了什么,JS中有什么东西改变了,或者这是书中的错误.

>>> function Hero(){}
>>> var h = new Hero();
>>> var o = {};
>>> h instanceof Hero;
true
>>> h instanceof Object;
false //true in Google Chrome
>>> o instanceof Object;
true 
Run Code Online (Sandbox Code Playgroud)

书摘

谷歌Chrome输出

javascript instanceof

5
推荐指数
1
解决办法
155
查看次数

输入变量vs instanceof进行标识

我有两个类,它们是抽象类的子类A:

class X extends A {}
class Y extends A {}
Run Code Online (Sandbox Code Playgroud)

我想识别A传递给函数的对象的子类.我可以看到两种选择:

void myfunction(A myobj) {
    if(myobj instanceof X)
        doXStuff((X) myobj);
    if(myobj instanceof Y)
        doYStuff((Y) myobj);
}
Run Code Online (Sandbox Code Playgroud)

或添加不同类型的enumto A:

abstract class A {
    enum Type { X, Y };
    Type type;
    ...
}

class X extends A {
    type = Type.X;
    ...
}
class Y extends A {
    type = Type.Y;
    ...
}

void myfunction(A myobj) {
    if(myobj.type == Type.X)
        doXStuff((X) myobj);
    if(myobj.type …
Run Code Online (Sandbox Code Playgroud)

java instanceof

5
推荐指数
1
解决办法
569
查看次数

Java - Class.isInstance()始终返回false

在我的GameObject类中,我有以下方法来检查GameObject是否会在移动到指定位置时与另一个对象发生碰撞:

public boolean collisionAt(Vector2d position, Class<? extends GameObject>... exclusions) {
    if (getBounds() == null)
        return false;
    Rectangle newBounds = getBounds().clone();
    newBounds.setPosition(position);
    // Check collisions
    for (GameObject object : new ArrayList<>(gameObjects)) {
        if (object.getBounds() != null && newBounds.intersects(object.getBounds()) && object != this) {
            boolean b = true;
            for (Class<? extends GameObject> exclusion : exclusions) {
                if (object.getClass().isInstance(exclusion))
                    b = false;
            }
            if (b)
                return true;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我想允许程序定义排除项,例如,如果我不希望此方法在与法术冲突时返回true.但由于某种原因,Class.isInstance()行始终返回false.我甚至试过这个:

System.out.println(Spell.class.isInstance(Spell.class));
Run Code Online (Sandbox Code Playgroud)

并且控制台输出错误!这里发生了什么?

java reflection class instanceof

5
推荐指数
2
解决办法
2923
查看次数

JavaScript - 不做我期望的实例

如果我错了,请原谅我,但我认为通过这样做:

function MyObject()
{
    return {
        key: 'value',
        hello: function() { console.log('world'); }
    };
}

var obj = new MyObject();
Run Code Online (Sandbox Code Playgroud)

我创建了一个MyObject类型的新实例.

但是,如果我这样做:

obj instanceof MyObject
Run Code Online (Sandbox Code Playgroud)

它返回false.这让我感到困惑,因为我认为这会回归真实.

我在这做错了什么?

这是一个测试这个的小提琴.

我认为我是新的JavaScript基础知识,但也许不是.但是,我发现的消息来源与我的发现相矛盾.

javascript constructor object instanceof

5
推荐指数
1
解决办法
53
查看次数

确定对象是否是JavaScript中的Map

我正在编写一个函数,true如果传递给它的参数是JavaScript Map的实例,则返回该函数.

你可能已经猜到了typeof new Map()返回字符串object,我们没有得到一个方便的Map.isMap方法.

这是我到目前为止:

function isMap(v) {
  return typeof Map !== 'undefined' &&
    // gaurd for maps that were created in another window context
    Map.prototype.toString.call(v) === '[object Map]' ||
    // gaurd against toString being overridden
    v instanceof Map;
}

(function test() {
  const map = new Map();

  write(isMap(map));

  Map.prototype.toString = function myToString() {
    return 'something else';
  };

  write(isMap(map));
}());

function write(value) {
  document.write(`${value}<br />`);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都那么好,但是当测试帧之间的映射以及何时toString() …

javascript typeof instanceof

5
推荐指数
1
解决办法
2549
查看次数

避免使用依赖于特定条件的对象创建的If-else代码气味

是否有更好的方法来处理对象(Product)的实例化,这取决于另一个对象类型(Condition)而不是使用if-else配对,instanceof如下面的代码所示?

import java.util.ArrayList;
import java.util.List;

abstract class AbstractProduct {
    private AbstractCondition condition;
    public AbstractProduct(AbstractCondition condition) {
        this.condition = condition;
    }
    public abstract void doSomething();
}

class ProductA extends AbstractProduct {
    AbstractCondition condition;
    public ProductA(AbstractCondition condition) {
        super(condition);
    }

    @Override
    public void doSomething() {
        System.out.println("I'm Product A");
    }
}

class ProductB extends AbstractProduct {    
    public ProductB(AbstractCondition condition) {
        super(condition);
    }   

    @Override
    public void doSomething() {
        System.out.println("I'm Product B");
    }
}

class AbstractCondition { }

class …
Run Code Online (Sandbox Code Playgroud)

java oop design-patterns instanceof java-6

5
推荐指数
1
解决办法
179
查看次数