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