小编Tre*_*ent的帖子

arraycopy():当length参数为0时,Java是否会忽略索引参数?

我写了一些我认为在某些情况下应该会失败的代码,但事实并非如此。我正在做一个arraycopy(),在某些情况下,它会要求复制到越界索引,但是在所有这种情况下,传递给arraycopy()的长度将为0。

我唯一的猜测是Java的arraycopy()实现首先检查length = 0,如果返回则不检查索引参数?我找不到任何关于arraycopy()内部工作方式的参考。

如果这是Java实现的方式,并且代码运行良好,那么我的直觉告诉我,我仍然应该编写代码,这样就不会发生。我应该为此担心吗?

代码是:

if (manyItems == data.length) {
        ensureCapacity(manyItems * 2 + 1); 
    }
    if (manyItems == currentIndex) {
        data[currentIndex] = element;
    } 
    else {   // if data.length = 10, manyItems = 9, currentIndex = 8,
                     //   currentIndex + 2 = 10, which is out of bounds.
                     //   But manyItems - currentIndex -1 = 0, so nothing is copied.
        System.arraycopy(data, currentIndex + 1, data, currentIndex + 2,
            manyItems - currentIndex - 1);
        data[currentIndex + 1] …
Run Code Online (Sandbox Code Playgroud)

java arrays arraycopy

5
推荐指数
1
解决办法
1680
查看次数

在java方法中使用泛型时如何正确转换?

我有一个分配来实现我自己的Collections.fill()和Collections.reverse()版本.这些算法很简单,但我在涉及的泛型中有点迷失,特别是当我需要进行转换时.

我最初的想法是这样的:

public static void reverse(List<?> a_list) {
    int list_size = a_list.size();
    ListIterator<?> left_to_right = a_list.listIterator();
    ListIterator<?> right_to_left = a_list.listIterator(list_size);
    ? temp_variable;

    // ..doing some stuff

    right_to_left.set(temp_variable);

}
Run Code Online (Sandbox Code Playgroud)

但当然我不能将temp声明为"?"类型.声明为"对象temp_variable"是有道理的,但是最后调用set(temp_variable)将不起作用(因为ListIterator不会使用Object - 因为列表可能不是类型List <Object>).

这对我来说很有意义,然后将temp声明为Object,并强制转换ListIterators:

ListIterator<Object> left_to_right = 
    (ListIterator<Object>) a_list.listIterator();
ListIterator<Object> right_to_left = 
    (ListIterator<Object>) a_list.listIterator(list_size);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,编译器给了我未经检查的强制转换警告,但考虑到我的实现,我想不出它会如何破坏.这样做有危险吗?

然后在Collections.fill()中,我原本想做类似的事情:

public static <E> void fill(List<? super E> a_list, E an_object) {
    ListIterator<E> an_iterator = (ListIterator<E>) a_list.listIterator();

            // ..doing some stuff
    an_iterator.set(an_object);

}
Run Code Online (Sandbox Code Playgroud)

这也给出了未经检查的投射警告.并且考虑更多,即使我仍然得到警告,做一个类似的演员会更安全:

ListIterator<Object> an_iterator = (ListIterator<Object>)a_list.listIterator();
Run Code Online (Sandbox Code Playgroud)

如果列表的泛型类型实际上是E的超类,那么对于List的对象,而不是ListIterator对于列表的泛型类型的子类,应该更安全地转换为ListIterator,不应该这样吗?

任何建议都会受到赞赏......我认为我们的导师不希望我们参与其中,但我想更好地理解泛型.

java generics

1
推荐指数
1
解决办法
181
查看次数

标签 统计

java ×2

arraycopy ×1

arrays ×1

generics ×1