我有这个代码,它给我一个错误,"无法创建一个BST_Node的通用数组"
BST_Node<Integer>[] arrayTree = new BST_Node<Integer>[treeSize];
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,因为我有
Integer[] arrayTree = new Integer[treeSize];
Run Code Online (Sandbox Code Playgroud)
它完美无缺.为什么它不能创建具有泛型类型的固定大小数组,这是正确的方法吗?
虽然此代码成功编译,但它会在运行时抛出类转换异常错误:
class Test {
public static void main(String[] args) {
MyArray<String> x = new MyArray<>();
x.a[0] = "test string";
}
}
class MyArray<T> {
T[] a;
MyArray() {
this.a = (T[]) new Object[1];
}
}
Run Code Online (Sandbox Code Playgroud)
错误消息:
Exception in thread "main" java.lang.ClassCastException:
[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at Test.main(Test.java:4)
Run Code Online (Sandbox Code Playgroud)
我知道的一个可能但简单的解决方案是将数组声明为Object类型的数组,然后在想要从数组中检索数组时将数组元素转换回T,如下所示:
class Test {
public static void main(String[] args) {
MyArray<String> x = new MyArray<>();
x.a[0] = "test string";
System.out.println(x.get(0));
}
}
class MyArray<T> {
Object[] a;
MyArray() { …Run Code Online (Sandbox Code Playgroud) 我在许多答案(例如,这个)中看到,使用泛型创建数组的方法如下:
T[] array = (T[]) new Object[SIZE];
Run Code Online (Sandbox Code Playgroud)
我想尝试做类似的事情:
EntryRecipient<K,V>[] array = (EntryRecipient<K,V>[]) new Object[MAX_SIZE];
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,抛出以下错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [LHashTable$EntryRecipient;
Run Code Online (Sandbox Code Playgroud)
我的代码是:
HashTableEntry(包含在HashTable的私有子类中)
class HashTableEntry<K,V> {
private K key;
private V value;
public HashTableEntry(K key, V value) {
this.key = key;
this.value = value;
}
public V value() {
return value;
}
public K key() {
return key;
}
}
Run Code Online (Sandbox Code Playgroud)
EntryRecipient(作为HashTable的私有子类包含)
private class EntryRecipient<K,V> {
private List<HashTableEntry<K,V>> entries;
public EntryRecipient() { …Run Code Online (Sandbox Code Playgroud) 我们有一个C#代码库,我们必须在Java上部署.
我们正在创建一个读取C#并编写Java的迁移引擎.
我们已经为我们的代码中使用的系统创建了类的存根类,并且正在实现它们.
当我开始使用List<T>Java时,我在实现时遇到了问题ToArray.
根据我的理解,由于Java和C#在泛型方面的主要差异,因此无法知道泛型类的类型,因此无法创建类型化数组.
这是最终的,或者你们中的任何人都知道ToArray在泛型类中做一些聪明的方法而不在这里或在构造函数中传递数组或类型作为参数.
我试图在Java中编写一些简单的数字代码,以后可以在float和double之间进行选择.我的类的简化版本如下所示:
public class UniformGrid<T> {
public T[] data;
public UniformGrid(int arrayDim) {
data = new T[arrayDim];
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用我generic array creation在尝试编译时遇到错误.谷歌搜索和阅读我学到的java.lang.reflect.Array并尝试使用的一些SO答案
data = (T[]) Array.newInstance(T.class, arrayDim);
Run Code Online (Sandbox Code Playgroud)
这也没有用,因为T(可能)是一种原始类型.我的Java知识非常生疏(特别是涉及泛型时),我想知道为什么new运算符不能与泛型数组类型一起使用.当然,我也对如何用Java解决这个问题感兴趣.
我正在尝试编写一个通用容器,我必须使用一个数组.我收到以下错误:
Exception in thread "main" java.lang.ClassCastException:
[Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
Run Code Online (Sandbox Code Playgroud)
这是我的代码的一部分:
class MinFo<T extends Comparable> {
private final T[] array;
MinFo(int size){
array = (T[]) new Object[size];
}
T get(){
if(this instanceof Comparable){
int tmpPos = getNotNull();
T tmp = array[tmpPos];
int pos;
for(pos = tmpPos ; pos < array.length; getNotNull()){
if(tmp.compareTo(array[pos]) > 0)
tmp = array[pos];
}
Run Code Online (Sandbox Code Playgroud)
这导致我从类声明中删除"extends Comparable".现在我有一个不同的错误:
error: cannot find symbol
if(tmp.compareTo(array[pos]) > 0)
^
symbol: method compareTo(T)
location: variable tmp of type …Run Code Online (Sandbox Code Playgroud) 我正在研究一个项目,我坚持这个方法public DynArray(boolean allowNulls).
我想知道是否有人可以帮我这个方法.我要做的是创建一个DynArray对象,该对象可以允许或禁止其元素为空值,具体取决于为allowNulls参数提供的值.
到目前为止我有
public class DynArray<T> {
private static final int INITIAL_CAPACITY = 10;
private T[] theData;
private int size = 0;
private int capacity = 0;
public DynArray( boolean allowNulls ) {
capacity = INITIAL_CAPACITY;
if( allowNulls == true){
// ???
}
else {
// ???
}
}
public DynArray() {
capacity = INITIAL_CAPACITY;
theData = (T[]) new Object[capacity];
}
Run Code Online (Sandbox Code Playgroud)
有人可以指出我哪里出错了吗?
我正在尝试转换以下方法:
public List<AliasIp> getStoreAsList(String storeName) {
return new java.util.ArrayList<>(Arrays.asList(mGson.fromJson(getStoreRaw(storeName), AliasIp[].class)));
}
Run Code Online (Sandbox Code Playgroud)
对于类似于的通用版本:
public <T> List<T> getStoreAsList(String storeName) {
return new java.util.ArrayList<T>(Arrays.asList(mGson.fromJson(getStoreRaw(storeName), T[].class)));
}
Run Code Online (Sandbox Code Playgroud)
但是我遇到了T [].类的麻烦,它没有编译错误:
"无法从类型变量中选择"
应该用什么语法来避免这个错误?
我有以下两行:
Map<String,Object>[] IEXDivMap = null;
IEXDivMap = new Map[IEXJsonArray.length()];
Run Code Online (Sandbox Code Playgroud)
并得到警告:
The expression of type Map[] needs unchecked conversion to conform to Map<String,Object>[]
Run Code Online (Sandbox Code Playgroud)
有办法解决吗?
更新:
在评论中有人问我为什么我们需要一个Map数组。我们将获得一系列哈希图,并将每个哈希图放置在map数组中。这是代码:
@SuppressWarnings("unchecked")
public static Map<String,Object>[] getDiv(String ticker) {
Map<String,Object>[] IEXDivMap = null;
try{
String url = "https://api.IEXtrading.com/1.0/stock/" + ticker + "/dividends/1y";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
if(responseCode == 404){
System.out.println("Ticker " + ticker + " NOT FOUND in getDiv()!");
return IEXDivMap;
}else if (responseCode != 200){ …Run Code Online (Sandbox Code Playgroud) 我的问题很简单.
核心Java中是否有一个方法可以执行以下代码:
<T> T[] asArray(T... values) {
return values;
}
Run Code Online (Sandbox Code Playgroud)
我尝试在Arrays类中寻找它,但似乎没有这样的方法.
给你一个背景:
之前使用过该代码的人认为varargs比类构造函数中的常规数组更好(即使它应该是一个数组).现在我必须添加另一个通用数组作为构造函数的最后一个参数,从而转换此代码:
public Clazz(String... values) {
}
Run Code Online (Sandbox Code Playgroud)
对此
public <T> Clazz(String[] values, T[] additionalParameters)
Run Code Online (Sandbox Code Playgroud)
因此,我需要重构使用此构造函数的所有位置.更糟糕的是,有一些其他类遵循相同的模式,我需要在将来的某个时候修改它们.这就是上面提到的方法asArray可以提供的帮助.
我知道最好在每次出现时用显式数组创建替换varargs(这也就是我要做的事情),但我仍然想知道是否已经存在这样的方法(仅仅是出于好奇心).