# 一个数组的抽象？

go评论107阅读模式

An abstraction of an array?

# 问题

^^ 这里的目标是构建一个关于磁盘上整数数组的抽象表示。如果文件存在，应该打开该文件并计算其长度（忽略 size 参数）。如果文件不存在，应该创建该文件并将 size 个零写入文件。

this is for a assignment, and one of the tasks is to create a abstraction of a array, does it mean that i am declaring a array that's abstract here, if so how would i declare it

``````private abstract Array&lt;TYPE&gt; Disk = new Array&lt;TYPE&gt;()
``````

? something like that?
or is it impossible to create a abstract array and its talking about making a class abstract and inserting a array in that class

// Build an abstraction of an array of integers on disk. If the file exists,
* it should be opened and its length calculated (size parameter is ignored).
* If the file doesn't exist, it should be created and size zeros should be
* written to the file.
^^
goal here

please don't answer or give me any code, other than a yes or no to declaring that array and wether it would work

# 答案1

• “创建一个抽象数组”并不是在构建一个抽象。通常，抽象方法用于表示该方法没有实现。在这个上下文中，我认为这毫无意义。
• 创建抽象类也是同样道理。

• 你必须针对某个东西创建一个抽象，这意味着你想要隐藏细节和/或信息。在你的情况下，你有一个整数数组，想要将其存储在磁盘上。此外，你有一些操作要应用于它。这就给你了一个抽象。你定义一个接口（操作），并隐藏所有其余部分（整数数组，存储在磁盘上）。换句话说，你抽象化了所有细节，并提供了一些易于使用的接口。

The given input is a bit sparse, so I can only guess what to do.

An abstraction can be interpreted in multiple ways.

• To "create an abstract array" is not building an abstraction. Usually an abstract method is used to signify, that this method has no implementation. In this context I think it doesn't make any sense.
• The same with making an abstract class.

or, as I would argue:

• You have to create an abstraction of something, which means you want to hide details and/or information. In your case, you have an array of integers, and you want to store it on disk. Furthermore, you have some operations you want to apply to this. This gives you an abstraction. You define an interface (operations) and hide all the rest (array of ints, store on disk). In other words, you abstracted all the details, and provided some easy to use interface.

So In my opinion, you have to create a class having the asked operations, and implement some store/load methods, and return the appropriate results.

# 答案2

``````class MyArray<T> {
private final T[] arr;
public MyArray(Class<T> klass, int n) {
arr = (T[]) java.lang.reflect.Array.newInstance(klass, n);
}
public T get(int index) {
return (T) arr[index];
}
public void set(int index, T t) {
arr[index] = t;
}
}
``````

You can't have abstract fields like in your example.

About an abstraction over arrays - you might be able to do it, but I don't think it's worth it. `List`s and other classes have their type parameters erased at runtime, so you can do all sorts of casting with them. However, arrays know the class of their elements, meaning you can't just do `T[] foo = new T[]{}` given some type parameter `T`. You could, of course, cast an `Object[]` to a `T[]`, but even if that works at compile time, you would get a `ClassCastException` at runtime.

However, if you have a `Class&lt;T&gt;` object in addition to some type parameter `T`, you can use `Array.newInstance()` to create arrays. Here's one way you could do it, but casting, say, a `MyArray&lt;String&gt;` to a `MyArray&lt;Object&gt;`, and then using `getArray` as an `Object[]`, will cause a class cast exception.

``````class MyArray&lt;T&gt; {
private final T[] arr;
public MyArray(Class&lt;T&gt; klass, int n) {
arr = (T[]) java.lang.reflect.Array.newInstance(klass, n);
}
public T get(int index) {
return (T) arr[index];
}
public void set(int index, T t) {
arr[index] = t;
}
}
``````

• 本文由 发表于 2020年10月1日 06:34:45
• 转载请务必保留本文链接：https://go.coder-hub.com/64146658.html
• java

go 63

go 65

go 72

go 66