Java 如何创建泛型嵌套类的实例数组?

Java 如何创建泛型嵌套类的实例数组?,java,arrays,Java,Arrays,我尝试创建一个内部类对象的实例数组,这些对象是从泛型内部类派生的 当我这么做的时候 delivery.columns = new Delivery.Column[] { delivery.new Number (), delivery.new Date () }; 我收到警告: Table.java:58:警告:[rawtypes]找到原始类型:Table.Column delivery.columns=newdelivery.Column[]{delivery.new Number(),de

我尝试创建一个内部类对象的实例数组,这些对象是从泛型内部类派生的

当我这么做的时候

delivery.columns = new Delivery.Column[] { delivery.new Number (), delivery.new Date () };
我收到警告:

Table.java:58:警告:[rawtypes]找到原始类型:Table.Column
delivery.columns=newdelivery.Column[]{delivery.new Number(),delivery.new Date()};
^
泛型类表.Column缺少类型参数
其中V是一个类型变量:
V扩展类表.Column中声明的对象
Table.java:58:警告:[未选中]未选中的转换
delivery.columns=newdelivery.Column[]{delivery.new Number(),delivery.new Date()};
^
必填项:表.列[]
找到:Table.Column[]
2警告
如果我遵循警告中的要求并执行以下操作

delivery.columns = new Delivery.Column<Object>[] { delivery.new Number (), delivery.new Date () };
delivery.columns=newdelivery.Column[]{delivery.new Number(),delivery.new Date()};
我得到以下错误:

Table.java:58:错误:不兼容的类型:Delivery.Number无法转换为Table.Column
delivery.columns=newdelivery.Column[]{delivery.new Number(),delivery.new Date()};
^
Table.java:58:错误:不兼容的类型:Delivery.Date无法转换为Table.Column
delivery.columns=newdelivery.Column[]{delivery.new Number(),delivery.new Date()};
^
表.java:58:错误:泛型数组创建
delivery.columns=newdelivery.Column[]{delivery.new Number(),delivery.new Date()};
^
3个错误
如何在没有警告和错误的情况下解决此问题

以下是完整的示例:

import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.lang.System.err;

abstract class Table
{
  String           name = null;
  Column<Object>[] columns = null;

  abstract class Column<V>
  {
    String  name = null;
    Integer type = null;

    class Value
    {
      V value;

      Value (V value)
      {
        this.value = value;
      }
    }

    public String toString ()
    {
      return name + ": " + type.toString();
    }
  }

  public String toString ()
  {
    return this.name + " ("
      + Stream.of(columns).map (Column<Object>::toString).collect (Collectors.joining (", "))
      + ")";
  }
}

class Delivery extends Table
{
  { name = "Delivery"; }

  class Number extends Delivery.Column<String>
  {
    { name = "Number"; }
  }

  class Date extends Delivery.Column<String>
  {
    { name = "Date"; }
  }

  public static void main (String[] args)
  {
    String[] strings;
    Delivery delivery = new Delivery ();
    delivery.columns = new Delivery.Column<Object>[] { delivery.new Number (), delivery.new Date () };
    err.println (delivery);
  }
}
import java.util.stream.collector;
导入java.util.stream.stream;
导入静态java.lang.System.err;
抽象类表
{
字符串名称=null;
Column[]columns=null;
抽象类列
{
字符串名称=null;
整型=空;
阶级价值
{
V值;
值(V值)
{
这个值=值;
}
}
公共字符串toString()
{
返回名称+“:”+type.toString();
}
}
公共字符串toString()
{
返回此参数。名称+“(”
+Stream.of(columns).map(Column::toString.collector(Collectors.joining)(“,”))
+ ")";
}
}
类传递扩展表
{
{name=“交货”;}
类号扩展了Delivery.Column
{
{name=“Number”;}
}
类日期扩展了Delivery.Column
{
{name=“Date”;}
}
公共静态void main(字符串[]args)
{
字符串[]字符串;
交货期=新交货期();
delivery.columns=newdelivery.Column[]{delivery.new Number(),delivery.new Date()};
err.println(交付);
}
}

我不确定这是否是一个合适的解决方案,它更像是一个使用
列表>列的解决方案;
受保护列[]arrColumns=null;
公共列[]getColumnsAsArray(){
if(null==列){
返回null;
}
Column[]arr=(Column[])Array.newInstance(Column.class,columns.size());
返回列。toArray(arr);
}
公共字符串toString(){
返回此名称
+\n列表:(“+columns.stream().map(Column::toString.collect)(收集器.joining(“,”)+”)
+“\narr:(“+Stream.of(arrColumns).map(Column::toString.collect)(collector.joining(“,”)+”)”;
}
因此,可以创建列列表并将其转换为数组,如下所示:

公共类主{
公共静态void main(字符串[]args){
交付=新交付();
delivery.columns=Arrays.asList(delivery.new Number(),delivery.new Date());
delivery.arrColumns=delivery.getColumnsAsArray();
打印错误(交付);
Arrays.stream(delivery.arrColumns)
.map(对象::getClass)
.forEach(System.out::println);
}
}
类传递扩展表{
{name=“交货”;}
类编号扩展了Table.Column{
{name=“Number”;type=1;}//定义_type_u以防止列::toString中出现NPE
}
类日期扩展表.Column{
{name=“Date”type=10;}//定义_type_以防止NPE
}
}
输出

# stderr
Delivery
list: (Number: 1, Date: 10)
arr: (Number: 1, Date: 10)

# stdout
class Delivery$Number
class Delivery$Date


使用编译器选项验证
-Xlint:all

您的代码
delivery.columns=new delivery.Column[]
与错误消息
delivery.columns=new delivery.Column[]
不一致,该错误消息明确指出缺少类型参数。哪一个是正确的?
Column[/columns
无法(安全地)为其分配值,因为您无法创建通用数组。改为使用
列表
。您需要使用
javac-Xlint:all
进行编译才能看到警告。@ceving,对不起,我假设默认情况下启用了此选项。我更新了答案,现在编译器不显示任何警告。使用这种方法,我认为您不需要定义
getColumnsAsArray()
。您只需将分配更改为
delivery.columns=newdelivery.Column[]{delivery.new Number(),delivery.new Date()}
@HiteshA.Bosamiya,这样的实现会导致不必要的编译器警告,这种情况在文章的开头描述。