gpt4 book ai didi

java - 有没有更简洁的方法来初始化这个通用数组?

转载 作者:行者123 更新时间:2023-11-29 08:19:34 26 4
gpt4 key购买 nike

昨天我试图创建一个对象数组,属于泛型类的非静态内部类。好像没有什么好的办法。


第一次尝试:

public class Wibble<T>{  
public static void main(String...args){
new Wibble<String>();
}
public Wibble(){
Bar[] bar = new Bar[11];
}
static class Foo{}
class Bar extends Foo{}
}

这不起作用,因为“Wibble”上下文中的“Bar”是隐式泛型,导致以下错误:

Exception in thread "main" java.lang.Error:  
Unresolved compilation problem: Cannot create a generic array of Wibble<T>.Bar

at Wibble.<init>(Wibble.java:7)
at Wibble.main(Wibble.java:4)

第二次尝试:

public class Wibble<T> {  
public static void main(String...args){
new Wibble<String>();
}
public Wibble(){
Bar[] bar = (Bar[])new Foo[11];
}
static class Foo{}
class Bar extends Foo{}
}

这不起作用,因为数组只能从最近的已知非通用类型转换为通用类型。对于泛型 Bar,最近已知的非泛型类型是非泛型 Bar,它不能(很容易?)在父类的上下文中被引用。导致以下错误:

Exception in thread "main" java.lang.ClassCastException:  
[LWibble$Foo; cannot be cast to [LWibble$Bar;

at Wibble.<init>(Wibble.java:7)
at Wibble.main(Wibble.java:4)

最后的尝试:

public class Wibble<T> {  
private static final Class<?> BARCLASS = new Wibble<Object> (false).new Bar().getClass();
public static void main(String...args){
new Wibble<String>();
}
private Wibble(boolean flag){}
public Wibble(){
Bar[] bar = (Bar[])Array.newInstance(BARCLASS, 11);
}
static class Foo{}
class Bar extends Foo{}
}

这可行,但是,如果您希望在构造函数中创建数组,您还需要一个(私有(private))虚拟构造函数,以便您可以获得该类。
此外,如果父类是抽象的,则需要为所有抽象方法提供虚拟实现。


当我写完这篇文章时,我意识到

public class Wibble<T> {    
public static void main(String...args){
new Wibble<String>();
}
private Wibble(boolean flag){}
public Wibble(){
Bar[] bar = (Bar[])Array.newInstance(Bar.class, 11);
}
static class Foo{}
class Bar extends Foo{}
}

效果也不错,我想我还不如继续发帖。尽管如此,它仍然很丑陋,并且没有理由证明正常语法不起作用。

最佳答案

如果您还将 Bar 声明为静态类,则以下代码(即最明显的代码)将在编译和运行时都有效:

Bar[] bar = new Bar[11];

编辑

使用 java.lang.reflect.Array.newInstance 是在运行时分配新通用数组的首选方法

关于java - 有没有更简洁的方法来初始化这个通用数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1268829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com