我写了下一段代码:
private ArrayList<File> filter() {
ArrayList<File> result = _filters.get(0).buildTree(_dir.listFiles());
for (int i=1; i<_filters.size(); i++){
File[] tempDir = result.toArray();
result = _filters.get(0).buildTree(tempDir);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
正如你可以看到我有一个FILE的ArrayList,然后我使用返回和Object []数组的result.toArray,但它之前是File,所以为什么我不能将它转发回File,因为我试图在第3个在循环线?我得到下一个错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.io.File;
at oop.ex1.filescript.Command.filter(Command.java:50)
at oop.ex1.filescript.Command.run(Command.java:28)
Run Code Online (Sandbox Code Playgroud)
我有什么选择?
从非Java背景到Scala给我带来了很多困难,包括这个.
scala> class A
defined class A
scala> class B extends A
defined class B
scala> val a = new A
a: A = A@2e893a4a
scala> val b = new B
b: B = B@3a47c130
scala> a.asInstanceOf[B]
java.lang.ClassCastException: A cannot be cast to B
...
scala> b.asInstanceOf[A]
res1: A = B@3a47c130
Run Code Online (Sandbox Code Playgroud)
我知道ClassCastException被抛出,因为在运行时,a它看起来不像B,但实际上它是(据我所知).这里发生了什么?任何解决方法?谢谢.
编辑:JVM如何理解a无法转换为B?它a.getClass和之间进行了一些浅薄的比较B吗?
PS.我正在尝试将一个私有变量添加到库类中,并覆盖其中一个接受在库中定义的类作为参数的类方法(我正在尝试将该字段添加到的类).
可能是一个争论性话题,但是......我真的很讨厌我不能做到以下几点:
class User
{
public string ImageURL {get;set;}
}
class UserUI : User
{
public Brush ImageBrush {get;set;}
}
User user = GetFromUserFromServer(); //returns User type object, not UserUI
UserUI userUI = user;
userUI.ImageBrush = CreateBrush(userUI.ImageURL);
Run Code Online (Sandbox Code Playgroud)
相反,我使用以下内容:
class User
{
public virtual string ImageURL {get;set;}
}
class UserUI : User
{
public override string ImageURL
{
get
{
return base.ImageURL ;
}
set
{
if (value != base.ImageURL )
{
base.ImageURL = value;
ImageBrush = CreateBrush(value);
}
}
}
public …Run Code Online (Sandbox Code Playgroud) 我知道已经发布了一些与此相同主题相关的问题,但我看到了不同的答案,所以我对哪个答案是正确的感到困惑.
在下面的链接中,人们提到转发不可能 转换/转换基类型为派生类型
在下面的链接中,人们提到只有当派生类是基类downcast和upcast的实例时,才可能进行 向下转换.
我做了一个小实验并使用直接转换在一个迷你项目(C#)上实现了向下转换,例如:DerivedClass dc =(DerivedClass)baseClass,而不检查DerivedClass是否是BaseClass的实例,令我惊讶的是,它正在工作很好,没有任何错误,所以为什么人们说降级是不可能的?
所以我的问题是,转发真的不可能吗?为什么人们似乎对这个话题有不同的答案?毕竟哪一个是真正的答案?有人可以更详细地解释一下吗?
示例代码:
public class Order { }
public class PurchaseOrder : Order { // some new properties here for PurchaseOrder}
public static PurchaseOrder GetOrder()
{
Order order = new Order();
return (PurchaseOrder)order;
}
Run Code Online (Sandbox Code Playgroud) 两个类,D1并且D2从一个抽象基类派生B.他们每个人都在分享共同声明公共接口B,但他们每个人可能也有自己特定的公共接口(例如D2具有D2.Bar()这才有用D2对象):
public abstract class B
{
public int N { get; set; }
public abstract void Foo();
}
public class D1 : B
{
public override void Foo()
{
}
}
public class D2 : B
{
public override void Foo()
{
}
public void Bar()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我不断派生对象的组合在单个集合,(如表),因为有时候我不得不打电话共同(继承)在集合中的所有对象,但有时我想调用方法Bar()的D2唯一对象:
var list = new List<B>();
list.Add(new D1());
list.Add(new D2());
foreach(var b in …Run Code Online (Sandbox Code Playgroud) 在我的例子中:
在向上看,第二次d.print()打电话不应打印"基地"吗?
是不是"d"派生对象上传到基类对象?
在低迷时期,它有什么优势?
你能用实际的方式解释上传和下传吗?
#include <iostream>
using namespace std;
class Base {
public:
void print() { cout << "base" << endl; }
};
class Derived :public Base{
public:
void print() { cout << "derived" << endl; }
};
void main()
{
// Upcasting
Base *pBase;
Derived d;
d.print();
pBase = &d;
d.print();
// Downcasting
Derived *pDerived;
Base *b;
pDerived = (Derived*)b;
}
Run Code Online (Sandbox Code Playgroud) 在main下面的函数中,第一个static_cast是有效的,因为我试图将一个(对Derived1类的基类引用)转换为派生引用但是为什么第二个转换打印带有这些值,虽然它打印了垃圾值d2.y,但我认为它应该是警告或编译错误。对基对象的基引用如何选择派生类的值(d2.y在这种情况下,我也可以为其分配一个值)
有人可以解释一下在这两种情况下会发生什么。
class Base1
{
public:
Base1()
{
x = 999;
}
int x;
};
class Derived1: public Base1
{
public:
Derived1()
{
y = 1000;
}
int y;
};
int main()
{
Derived1 d;
std::cout << d.x << " " << d.y << std::endl;
Base1& b = d;
Base1 b1;
Base1 & b2 = b1;
Derived1& d1 = static_cast<Derived1&>(b);
Derived1& d2 = static_cast<Derived1&>(b2);
std::cout << d1.x << " " …Run Code Online (Sandbox Code Playgroud) 考虑我们有三个类,Shape 是基类,另外两个类 Circle 和 Text 继承自基类(Shape)
形状文件
namespace ObjectOriented
{
public class Shape
{
public int Height { get; set; }
public int Width { get; set; }
public int X { get; set; }
public int Y { get; set; }
public void Draw()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
文本文件
using System;
namespace ObjectOriented
{
public class Text : Shape
{
public string FontType { get; set; }
public int FontSize { get; set; }
public void Weirdo()
{
Console.WriteLine("Weird …Run Code Online (Sandbox Code Playgroud) 我在 Java 中采用了向上和向下转换的概念,它们也被称为扩大和缩小。
好的,我明白了概念和一切。但是,在这种情况下它是如何工作的?
public class ObjPair {
Object first;
Object second;
public ObjPair(Object first, Object second) {
this.first = first;
this.second = second;
}
public Object getFirst() {
return first;
}
public Object getSecond() {
return second;
}
public static void main(String[] args) {
ObjPair objPair = new ObjPair("A",2.2); // Goes widning conversion
System.out.println(objPair.getFirst());
System.out.println(objPair.getSecond());
}
}
Run Code Online (Sandbox Code Playgroud)
ObjPair objPair = new ObjPair("A",2.2);
现在,当我执行objPair.getFirst()和 …
我想Base从班级本身之外以不合格的方式(为什么?宏魔法)访问班级成员。策略是在Derived类中执行并将指向指针转换Base为指向指针Derived(即使实例不是a Derived)。
就我尝试而言,代码编译并正确运行:这是标准还是意外(标准是UB)?链接
#include<iostream>
struct Base{
int a=3;
};
struct Derived: public Base{
int getA(){
// this scope has unqualified access to Base class members
return a;
}
};
int main(void){
Base b;
std::cerr<<((Derived*)(&b))->getA()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)