我有两个类A和B,其中B是A的子类,A不是抽象的.因此,我可以拥有作为A实例的对象和作为B实例的对象(因此也是A的实例).
如何区分仅为A实例的对象?
当然,我可以编写类似"对象instaceof A &&!(B的对象实例)"但这是一个非常糟糕的设计,因为每次我向A添加新的子类时我都需要更改代码.更好的选择?
我想比较compareCriteria.简单的比如'between'和'inArray'或'greaterThan'.我对这些类使用多态.他们从compareCriteria接口共享的一种方法是'matchCompareCriteria'.
我想避免的是让每个班级检查他们应该匹配的compareCriteria的类型.例如,inArray对象将检查matchCompareCriteria是否传入inArray对象,否则它将返回false,如果它知道如何比较.
也许在这种情况下,instanceof是完全合法的(对象知道自己),但我仍然在寻找避免它的可能方法.有任何想法吗?
伪代码示例:
betweenXandY = create new between class(x, y)
greaterThanZ = create new greaterThan class(z)
greaterThanZ.matchCompareCriteria(betweenXandY)
Run Code Online (Sandbox Code Playgroud)
如果X和Y大于Z,它将返回true.
编辑:
1)instanceof就是我现在所看到的,匹配matchCompareCriteria方法.我想摆脱它
2)matchCompareCritera检查另一个是否包含compareCriteria.如果一个的所有可能值都包含在另一个中,则返回true.对于compareCriteria的许多组合,比较它们甚至没有意义,因此它们返回false(比如betweenAlfa和betweenNum之间是不兼容的).
想象一下,我想写一个无用的方法叫:isInstanceof返回一个boolean.
我在考虑它.但是我没有离开.一个instanceof有一个像使用:
[object] instanceof [a classname]
// I was thinking about something like this
public static boolean isInstanceof(Object obj, /*magic for the second param*/)
{
return obj instanceof /*the magical second param*/
}
Run Code Online (Sandbox Code Playgroud)
但是我如何为参数制作参数[a classname]?有没有办法做到这一点没有方法isInstance(Class cls)从java.lang.Class?
谢谢
可能重复:
instanceof - 不兼容的条件操作数类型
我试图使用下面的代码并获得编译错误.
Class<A> clas; //this is passed from service
clas instanceof SomeClass
Run Code Online (Sandbox Code Playgroud)
这给ma带来了以下编译错误:
不兼容的条件操作数类型Class和SomeClass
请帮我!
许多人不喜欢使用instanceof,但我发现在很多情况下,我们在equals方法方面几乎没有其他选择.看看下面的课程:
class A {
int n;
public A(int n) { this.n = n; }
@Override
public boolean equals(Object o) {
return false;
}
public boolean equals(A o) {
return n == o.n;
}
}
Run Code Online (Sandbox Code Playgroud)
我从来没有见过像这样的东西,但它可以作为一个替代品,instanceof用来测试一个Object是不是A?或者还有其他我没想过的问题?
在这个循环中,我迭代一个类型的ArrayList Entity,它包含Entity类型的对象以及Projectile类型的对象,它扩展了Entity.如果对象是Projectile的实例,我希望执行下面的代码.但是,该getVelocity()方法仅在子类Projectile中,而不在Entity中.所以我无法编译下面的代码.
我可以想办法解决这个问题,比如使用单独的ArrayLists.但是,重点是将所有实体保留在全局列表中而不是将它们分开.有这个问题的简单解决方案,还是我需要更改代码的结构?
for (Entity f: glo.getList()) {
if (f instanceof Projectile)
f.setX(f.getVelocity()/rawFPS);
}
Run Code Online (Sandbox Code Playgroud) 我有这个凌乱的代码,我真的想要清理,因为它有大约12个if if和每个if语句检查instanceof 2对象,所以类似于:if(parentObj instanceof superclass && parentObj2 instanceof superclass)
每个if语句执行不同的东西,所以我认为多态性不会让它变得更好.此外,因为这个小功能的12个不同的超类(大多数if语句执行1个衬里)会有点荒谬.多态无效的另一个原因是因为我无法访问父类或超类.我知道很多情况都不好,即使我从来没有真正理解为什么.在每个if语句中执行的方法不是父类,而是属于超类,因此我需要检查它们的类型,以便我可以转换它们并执行这些方法.关于如何清理它的任何想法?谢谢!
编辑:抱歉缺乏细节,我在手机上写了这个.无论如何,下面是我正在处理的一个例子.我看过战略模式,我唯一担心的是出于同样的原因,我必须创建许多不同的类,我觉得创建许多不同的对象只是为了一直执行1个衬里会有点浪费.另外在我看来,在策略设计中,我仍然需要进行许多实例检查以了解要执行的策略.无论如何,下面是一些代码:p
if (plotBlockState instanceof Sign && UpgradeBlockState instanceof Sign) {
//do Sign Stuff
}
else if (plotBlockState instanceof Chest && UpgradeBlockState instanceof Chest) {
//do Chest Stuff
}
else if (plotBlockState instanceof Dispenser && UpgradeBlockState instanceof Dispenser) {
//do Dispenser Stuff
}
else if (plotBlockState instanceof Furnace && UpgradeBlockState instanceof Furnace) {
//do Furnace Stuff
}
else if (plotBlockState instanceof BrewingStand && UpgradeBlockState instanceof BrewingStand) {
//do Brew Stand Stuff …Run Code Online (Sandbox Code Playgroud) 我在Java中有多个数据对象类型的基类.我想equals在基类中创建一个方法,它在继承时直接工作.
平等由两个对象决定
属于基类的子类.这很容易实现
if (!(anObject instanceof BaseClass))
return false;
Run Code Online (Sandbox Code Playgroud)具有相同的ID.ID字段由基类定义,因此我们可以在此测试.
if (this.id != ((BaseClass) anObject).id)
return false;
Run Code Online (Sandbox Code Playgroud)属于同一类.这就是我遇到问题的地方.两个对象可以是不同类型的(因此可以在不同的列表中),但具有相同的ID.我必须能够区分它们.我怎样才能做到这一点?
我的问题是,既然 new Test()既不是子类,String也不是String本身那么instanceof编译失败的原因呢?它不应该返回虚假.
public class Test{
public static void main(String[] args) {
//Compiles fails
System.out.println(new Test() instanceof String);
//compiles fine but run time class cast exception.
Test = (Test) new Object();;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我已经编辑了我的帖子,所以这就是我真正想知道为什么会有这种差异.为什么编译没有失败,尽管它应该
我认为标题是不言自明的。因此,假设我有以下代码:
interface A { }
abstract class B { }
class C { }
C c = new C();
System.out.println(c instanceof A); //fine
System.out.println(c instanceof B); // compile error
Run Code Online (Sandbox Code Playgroud)
在这个问题的评论中,我读到:
编译器永远无法知道给定类型是否未实现接口,因为潜在的子类可以实现该接口。
因此,如果interface此方法有效,为什么它不应该适用abstract class?它也应该由其他类进行扩展,因为它本身不能存在。有人可以澄清吗?
更新 编译消息:
错误:(22、28)Java:不兼容的类型:C无法转换为B
instanceof ×10
java ×9
arraylist ×1
class ×1
criteria ×1
equals ×1
inheritance ×1
methods ×1
object ×1
oop ×1
polymorphism ×1