我需要返回一个String数组.我用番石榴来分裂String.请参阅下面的代码
Iterable<String> arrayOfValues = Splitter.on(";").split(myString);
Run Code Online (Sandbox Code Playgroud)
它返回一个Iterable.但我需要一个String[].有没有办法给予Iterator< Element >和转换Array[].非常感谢
如果我有一个泛型类Foo<Bar>,我不允许创建一个数组,如下所示:
Bar[] bars = new Bar[];
Run Code Online (Sandbox Code Playgroud)
(这将导致错误"无法创建Bar的通用数组").
但是,正如dimo414在回答这个问题(Java如何:通用数组创建)中所建议的那样,我可以做到以下几点:
Bar[] bars = (Bar[]) new Object[];
Run Code Online (Sandbox Code Playgroud)
(这将"仅"生成警告:"类型安全:从Object []到Bar []"的未选中的强制转换.
在回应dimo414的回答的评论中,有些人声称使用这种结构可能会在某些情况下引起问题而其他人说它很好,因为对数组的唯一引用是bars,它已经是所需的类型.
我有点困惑,在哪些情况下这是可以的,在哪些情况下,它可以让我陷入困境.例如,newacct和Aaron McDaid的评论似乎直接相互矛盾.不幸的是,原始问题中的评论流只是以未解答的"为什么这个'不再正确'?"结束,所以我决定为它提出一个新问题:
如果bars-array只包含类型的条目Bar,那么在使用数组或其条目时是否仍然存在任何运行时问题?或者是唯一的危险,在运行时我可以在技术上将数组转换为其他东西(比如String[]),然后允许我用其他类型的值填充它Bar?
我知道我可以使用Array.newInstance(...),但我对上面的类型转换构造特别感兴趣,因为,例如,在GWT中,newInstance(...)-option不可用.
好吧,我已经阅读了很多这个问题的答案,但我有一个更具体的问题.以下面的代码片段为例.
public class GenericArray<E>{
E[] s= new E[5];
}
Run Code Online (Sandbox Code Playgroud)
在类型擦除之后,它变成了
public class GenericArray{
Object[] s= new Object[5];
}
Run Code Online (Sandbox Code Playgroud)
这段代码似乎运作良好.为什么会导致编译时错误?
此外,我从其他答案中得知,以下代码适用于同一目的.
public class GenericArray<E>{
E[] s= (E[])new Object[5];
}
Run Code Online (Sandbox Code Playgroud)
我读过一些评论说上面的代码是不安全的,但为什么它不安全?任何人都可以向我提供一个特定的例子,其中上面的代码导致错误?
另外,以下代码也是错误的.但为什么?擦除后似乎也能正常工作.
public class GenericArray<E>{
E s= new E();
}
Run Code Online (Sandbox Code Playgroud) 我已经在学校用C++编写了3年的代码.我刚开始在2天前用Java编写代码; 我的问题是:
制作通用数组是不好的做法吗?会有什么选择?
我很难过,除了做一些奇怪的事情之外,我似乎无法制作一个通用数组,比如这个例子:
//Class implementing the MergeSort algorithm with generic types
// Revised by Doina January 2014
package Sorting;
import java.lang.*;
public class MergeSort {
// Wrapper method for the real algorithm
// T is the generic type which will be instantiated at runtime
// elementas are required to be comparable
public static <T extends Comparable<T>> void sort(T[] a) {
mergesort(a, 0, a.length - 1);
}
// Recursive mergesort method, following the pseudocode
private static <T extends Comparable<T>> void …Run Code Online (Sandbox Code Playgroud) 我是Java的新手,所以我可能在这里做错了,我想创建一个Sets数组,我得到一个错误(来自Eclipse).我有一节课:
public class Recipient
{
String name;
String phoneNumber;
public Recipient(String nameToSet, String phoneNumberToSet)
{
name = nameToSet;
phoneNumber = phoneNumberToSet;
}
void setName(String nameToSet)
{
name = nameToSet;
}
void setPhoneNumber(String phoneNumberToSet)
{
phoneNumber = phoneNumberToSet;
}
String getName()
{
return name;
}
String getPhoneNumber()
{
return phoneNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个数组:
Set<Recipient>[] groupMembers = new TreeSet<Recipient>[100];
Run Code Online (Sandbox Code Playgroud)
我得到的错误是"无法创建TreeSet的通用数组"
怎么了 ?
简而言之,这不会编译:
public <A> void test() {
A[] temp = new A[]{};
}
Run Code Online (Sandbox Code Playgroud)
是因为向后兼容性问题,还是语言设计中的一些根本兼容性呢?
为什么代码替代(1)编译时没有警告,代码替代(2)产生"未经检查的强制转换"警告?
两者共同:
class Foo<T> {
Foo( T [] arg ) {
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案(1):
class Bar<T> extends Foo<T> {
protected static final Object [] EMPTY_ARRAY = {};
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案(2):
class Bar<T> extends Foo<T> {
@SuppressWarnings("unchecked")
Bar() {
super( (T []) EMPTY_ARRAY );
}
protected static final Object [] EMPTY_ARRAY = {};
}
Run Code Online (Sandbox Code Playgroud)
备选方案(2)产生:
javac -Xlint:unchecked Foo.java Bar.java
Bar.java:4: warning: [unchecked] unchecked cast
super( (T []) EMPTY_ARRAY );
^
required: T[]
found: …Run Code Online (Sandbox Code Playgroud) 在Java ArrayList<E>实现基础上的一个对象数组.
任何人都可以解释一下为什么ArrayList<E>使用数组Object[]实现数据存储而不是E[]?使用有什么好处Object[]?
假设我有一个带泛型参数T的泛型类,它是一个Number子类.我想在课程构建期间初始化一个T数组.可能吗?如果有,怎么样?如果不是为什么?
public class AClass<T extends Number>{
private T array[];
private int arrayOfInt[];
public AClass(int size){
arrayOfInt = new int[size];
array = ? //what should I put here?
}
}
Run Code Online (Sandbox Code Playgroud)