(请不要告诉我应该抽象X更多并添加另一种方法.)
在C++中,当我有一个x类型的变量,X*并且我想要做一些特定的事情,如果它也是类型Y*(Y作为其子类X),我写这个:
if(Y* y = dynamic_cast<Y*>(x)) {
// now do sth with y
}
Run Code Online (Sandbox Code Playgroud)
在Java中似乎不可能做同样的事情(或者是吗?).
我已经阅读了这个Java代码:
if(x instanceof Y) {
Y y = (Y) x;
// ...
}
Run Code Online (Sandbox Code Playgroud)
有时,当你没有变量x但是它是一个更复杂的表达式时,正是因为这个问题,你需要在Java中使用一个虚拟变量:
X x = something();
if(x instanceof Y) {
Y y = (Y) x;
// ...
}
// x not needed here anymore
Run Code Online (Sandbox Code Playgroud)
(常见的是,something()是iterator.next().还有你看,你也不能真正称之为两次即可.你真的需要虚拟变量.)
x在这里你根本不需要- 你只是拥有它,因为你不能instanceof立即用演员表进行检查.再次将它与相当常见的C++代码进行比较:
if(Y* y = dynamic_cast<Y*>( something() …Run Code Online (Sandbox Code Playgroud) Eclipse表示,由于泛型橡皮擦,Type Parameter不允许使用instanceof操作.
我同意在运行时,不会保留类型信息.但请考虑以下类的通用声明:
class SomeClass<T>{
T t;
SomeClass(Object o){
System.out.println(o instanceof T); // Illegal
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时,不会出现T!但是如果我实例化这个类型为Integer的类,那么相应的对象将具有Integer类型的字段t.
那么,为什么我不能用T检查变量的类型,它可以在运行时被Integer替换.而我实际上会做类似"o instanceof Integer"的事情.
在哪些情况下,允许带有类型参数的instanceof会导致故障,从而禁止它?
我在C#中制作的游戏中遇到了一个问题.这是一个简单的基于磁贴的匹配游戏,问题出现在我试图制造的电源上:
假设我们有基本的瓷砖类型,圆形正方形和菱形,它们都是瓷砖的子类.我试图将"匹配"行为提取到抽象的Tile方法,而不是让圈子只与圈子匹配:canMatchWith(Tile t).Tiles还有两种方法来添加/删除它们可以匹配的Tiles.
所以说我们在游戏中间有一个圆形瓷砖,我们有一个补充说"圆形瓷砖本回合可以与方形瓷砖匹配".我将浏览所有Circle图块并说出circleTile.addCanMatchWith(typeof(Square)).在内部,我们有一个List canMatchWith.
然后,我想说"圆圈不能再与正方形匹配",只需说circleTile.removeCanMatchWith(typeOf(Square)).
这是我目前的解决方案,并且它很好用,没有我注意到的性能缺陷(这是一个基于区块的匹配游戏,所以这些类型每个'移动'只评估一次,而不是逐帧评估).然而,我脑中的声音告诉我,这是完成这种行为的一种不好的方法.所以我有一些选择:
这里的问题是冗余,我的枚举现在也有OVAL和ELIPSE,并且Elipse类将具有(CIRCLE,OVAL,ELIPSE TileTypes)作为它可以匹配的类型.这完全是多余的,我想只说"Circle",我可以用类型.我想Tiles可以有TileType baseType和TileType actualType.
总之,我想要实现的是让多个对象类型能够与任意数量的不同类型进行交互.问题是,我应该为Type使用什么.可以在这里使用GetType吗?枚举?或者有人会推荐更好的策略吗?我试图尽可能通用,这些磁贴不应该在其他磁贴上有任何硬编码依赖,并且必须能够在运行时更改他们可以与之交互的人.假设我创建了一个新的Tile子类,五角形......好吧,Pentagons可以与Squares,Circles和Pentagons匹配.我的实现很简单,但有些东西告诉我这是一个肮脏的OOP练习.
我觉得我必须使用Types/Enums,因为我不是想说这个Tile.addCanMatch(Tile someOtherObject).这太具体了,我希望thisTile能够与作为特定类的实例的所有tile匹配.
我有三个类,一个抽象用户和两个特定的: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继承它,当它不需要时功能. …
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.class并a.getClass()不能返回相同的类!
在哪种情况下我们会从isInstance()方法中得到真实的结果?
在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)


好的,我正在制作一个简单的java swing国际象棋游戏.这个问题更多的是关于OOP设计然后是Java Swing.
我有以下内容:
在我的主要ChessGame类中:
所以,左上方(0,0)映射到myArray [0] [0]
我的问题是,要检查这个地方是空的还是有棋子,我必须使用:
if(panels[x][y] instanceof Piece){
((Piece)panels[x][y]).makeMove();
}
Run Code Online (Sandbox Code Playgroud)
我问的是这个可怕的设计?我知道我应该尝试远离实例.什么是更好的方法?
谢谢.
我正在按照教程建议检查对象是否为字符串而不是空,如下所示:
var s = "text here";
if ( s && s.charAt && s.charAt(0))
Run Code Online (Sandbox Code Playgroud)
据说如果s是字符串,那么它有一个方法charAt然后最后一个组件将检查字符串是否为空.
我尝试用其他可用的方法测试它,比如(typeof和instanceof)使用一些SO问题,这里和这里也是!!
所以我决定在Js Bin中测试它:jsbin代码如下:
var string1 = "text here";
var string2 = "";
alert("string1 is " + typeof string1);
alert("string2 is " + typeof string2);
//part1- this will succeed and show it is string
if(string1 && string1.charAt){
alert( "part1- string1 is string");
}else{
alert("part1- string1 is not string ");
}
//part2- this will show that it …Run Code Online (Sandbox Code Playgroud) 通常,您可以使用以下命令检查变量是否是类的实例:
$foo instanceof bar
Run Code Online (Sandbox Code Playgroud)
但是在ArrayObjects(属于Symfony 2)的情况下,这似乎不起作用
get_class($foo) 回报 'Doctrine\Common\Collections\ArrayCollection'
然而
$foo instanceof ArrayCollection
Run Code Online (Sandbox Code Playgroud)
回报 false
is_array($foo)返回false并$is_object($foo)返回true
但我想对这种类型进行具体检查
如果我错了,请原谅我,但我认为通过这样做:
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基础知识,但也许不是.但是,我发现的消息来源与我的发现相矛盾.
instanceof ×10
java ×5
javascript ×3
object ×2
oop ×2
arraylist ×1
c# ×1
casting ×1
constructor ×1
doctrine-orm ×1
dynamic-cast ×1
generics ×1
inheritance ×1
isinstance ×1
php ×1
reflection ×1
string ×1
swing ×1
symfony ×1