说我有这样的功能:
function foo(bar) {
if (bar > 1) {
return [1,2,3];
} else {
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
并说我打电话foo(1),我怎么知道它返回一个数组?
在下面的代码中,x的类型是I(虽然x也实现了J但在编译时不知道),为什么(1)处的代码不会导致编译时错误.因为在编译时只考虑引用的类型.
public class MyClass {
public static void main(String[] args) {
I x = new D();
if (x instanceof J) //(1)
System.out.println("J");
}
}
interface I {}
interface J {}
class C implements I {}
class D extends C implements J {}
Run Code Online (Sandbox Code Playgroud) (请不要告诉我应该抽象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) 我想为某些类设置一个通用的包装类来拦截和操作一些方法调用.方法 - 呼叫转发,拦截,到目前为止没问题.但是经过一段时间的思考,我发现了一个问题,我没有解决方案:我在我的应用程序中使用内置的instanceof-operator.当然这将不再起作用,因为包装器不是其中类的实例.我想继续使用运算符,而不是用其他函数替换它.
有没有办法实现此问题的解决方法?这个操作符如何工作?它是否调用了我可能在包装器中覆盖的类的核心功能?
我知道这不是一个真正"干净"的解决方案来操纵这个操作符,但我认为这对我来说是最简单的解决方案.而且正如我们所知,PHP中有很多东西并不那么干净...... :-)
谢谢你的回答,本
我有一个java方法,应该检查ArrayList并检查它是否包含给定类的实例.我需要传递方法类型的类来检查作为参数,如果List包含给定类型的对象,则返回它.
这可以实现吗?
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会导致故障,从而禁止它?
我的问题是在运行时如何加载类信息?
有人打电话时instanceof是考虑RTTI还是反思?还是取决于实际情况?
我有一个名为User的抽象类,用户可以创建为学生类型或教师类型.我已经创建了一个用户(学生和教师)的ArrayList,我想要做的是调用一个方法示例,具体取决于当前对象是什么的实例:
for (User user : listOfUsers) {
String name = user.getName();
if (user instanceof Student) {
// call getGrade();
} else { // it is an instance of a Teacher
// call getSubject();
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是因为它是User对象的ArrayList,它无法获取Student类型方法,例如getGrade().但是,因为我能够确定当前用户的实例是什么,所以我很好奇是否仍然可以根据用户的类型调用特定方法.
这是可能的,还是我必须将用户类型分成单独的列表?
请尽快回复,非常感谢.
假设我有以下类层次结构:
public interface Result {
}
public class Failure implements Result {
private String msg;
public Failure(String msg) {
this.msg = msg;
}
@Override public String toString() { return msg; }
}
public class Success implements Result {
private int time, count;
public Success(int time, int count) { this.time = time; this.count = count; }
public int getTime() { return time; }
public int getCount() { return count; }
@Override public String toString() { return time + ", " + …Run Code Online (Sandbox Code Playgroud) 我在使用instanceof运算符时遇到问题,但它似乎不起作用.这是我的代码的一部分:
const results = _.map(items, function(item: Goal|Note|Task, index: number) {
let result = {};
if (item instanceof Goal) {
result = { id: index, title: item.name };
} else if (item instanceof Note) {
result = { id: index, title: item.content.text };
} else if (item instanceof Task) {
result = { id: index, title: item.name };
}
console.log(item);
console.log(item instanceof Goal);
console.log(item instanceof Note);
console.log(item instanceof Task);
return result;
});
Run Code Online (Sandbox Code Playgroud)
我的所有日志都显示为false,这是控制台的样子:
尽管明确只有3种类型是可能的,但它们都没有匹配.您还可以看到对象本身的类型名称为Goal,因此我不明白为什么它与目标的instanceof不匹配.
有任何想法吗?
instanceof ×10
java ×7
arraylist ×2
casting ×2
javascript ×2
abstract ×1
aop ×1
arrays ×1
decorator ×1
dynamic-cast ×1
generics ×1
inheritance ×1
interceptor ×1
php ×1
reflection ×1
rtti ×1
terminology ×1
typeof ×1
types ×1
typescript ×1