Java函数集合和未检查的警告

Java函数集合和未检查的警告,java,generics,compiler-warnings,type-erasure,Java,Generics,Compiler Warnings,Type Erasure,我已经编写了一个纯粹的函数集合类——bag aka multiset——它工作得很好,但在类定义本身和使用中,尤其是在和使用FBag.make时,都会为未经检查的赋值生成大量警告。就我所见,问题主要是因为函数集合需要静态工厂方法而不是公共构造函数,并且静态方法无法访问泛型类型 是否有一种优雅的方法来避免这种情况,或者我必须咬紧牙关,接受这是一个类型擦除问题,并抑制警告 代码如下。(我知道这个实现是渐进低效的。N预计会很小;如果这种情况发生变化,我将改变实现。) import java.util.

我已经编写了一个纯粹的函数集合类——bag aka multiset——它工作得很好,但在类定义本身和使用中,尤其是在和使用
FBag.make时,都会为未经检查的赋值生成大量警告。就我所见,问题主要是因为函数集合需要静态工厂方法而不是公共构造函数,并且静态方法无法访问泛型类型

是否有一种优雅的方法来避免这种情况,或者我必须咬紧牙关,接受这是一个类型擦除问题,并抑制警告

代码如下。(我知道这个实现是渐进低效的。N预计会很小;如果这种情况发生变化,我将改变实现。)

import java.util.Collection;
导入java.util.Iterator;
公共类FBag实现了Iterable{
公共静态最终FBag为空=新FBag(空,空);
私人最终FBag下一步;
私人终审法院;
私人FBag(E val,FBag next){
this.val=val;
this.next=next;
}
公共FBag地址(E val){
返回新FBag(val,本);
}
@凌驾
公共迭代器迭代器(){
归还新的Iter(本);
}
公共静态FBag品牌(集合c){
var p=空;
对于(变量a:c){
p=p.加上(a);
}
返回p;
}
公共静态FBag make(对象[]c,int-from,int-to){
var p=空;
for(var i=from;i
static
方法可以有自己的泛型声明,您可以使用它们从
集合或
T[]
创建
Fbag

public static <T> FBag<T> make(Collection<? extends T> c) {
    var p = EMPTY;
    for (var a : c) {
        p = p.add(a);
    }
    return p;
}

public static <T> FBag<T> make(T[] c, int from, int to) {
    var p = EMPTY;
    for (var i = from; i < to; i++) {
        p = p.add(c[i]);
    }
    return p;
}

public static FBag make(Collection对于
static
成员
EMPTY
,我相信没有办法使用原始类型。您可以在
Collections中看到相同的内容。EMPTY\u LIST

@SuppressWarnings("rawtypes")
public static final List EMPTY_LIST = new EmptyList<>();

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}

(我用显式声明替换了
var
s,因为我没有安装Java 10,也不想发布未经检查的代码)。

虽然这比OP的代码好,但返回
p
仍会产生未经检查的警告,因为
var p=EMPTY
FBag p=EMPTY
相同。
@SuppressWarnings("rawtypes")
public static final List EMPTY_LIST = new EmptyList<>();

@SuppressWarnings("unchecked")
public static final <T> List<T> emptyList() {
    return (List<T>) EMPTY_LIST;
}
@SuppressWarnings("rawtypes")
public static final FBag EMPTY = new FBag<>(null, null);

@SuppressWarnings("unchecked")
public static final <T> FBag<T> empty() {
    return (FBag<T>) EMPTY;
}
public static <E> FBag<E> make(Collection<E> c) {
    FBag<E> p = empty ();
    for (E a : c) {
        p = p.add(a);
    }
    return p;
}

public static <E> FBag<E> make(E[] c, int from, int to) {
    FBag<E> p = empty ();
    for (int i = from; i < to; i++) {
        p = p.add(c[i]);
    }
    return p;
}