2012-07-26 79 views
1

我有一个关于Java中的genrics(可能很简单)的问题。我有以下类:构造函数中的泛型Java类型错误

public class ValueCollection<Y> implements Collection<Y> 
{ 
    private Set<Entry<?, Y>> entries; 

    public ValueCollection(Set<Entry<?, Y>> entries) 
    { 
     this.entries = entries; 
    } 
    ... 
} 

当我这样调用构造函数:

return new ValueCollection<V>(entries); 

我得到以下编译器错误:

The constructor ValueCollection<V>(Set<Map.Entry<K,V>>) is undefined 

如果我改变我的同班同学这样的:

public class ValueCollection<X, Y> implements Collection<Y> 
{ 
    private Set<Entry<X, Y>> entries; 

    public ValueCollection(Set<Entry<X, Y>> entries) 
    { 
     this.entries = entries; 
    } 
    ... 
} 

and my cons这个工程师打电话给:

return new ValueCollection<K, V>(this.entries()); 

编译错误消失。我只是想知道为什么会这样。谢谢您的帮助!

+0

如果你在第一种情况下用'new ValueCollection (entries)'调用构造函数怎么办?你的第一堂课只有一个类型参数。 – millimoose 2012-07-26 18:54:08

回答

2

Set<Entry<?, V>>要么与任何密钥类型和值的类型的一组条目的V与一些特定但未知的密钥类型和K值类型V一组条目。由于后者,编译器会拒绝您最初的构造函数调用。

Set<? extends Entry<?, V>>一组与任何密钥类型和值类型V条目的条目。这正是你想要的,重新定义你的构造函数参数类型为Set<? extends Entry<?, V>>

您可以使用this.entries = Collections.unmodifiableSet(entries)this.entries = new HashSet<Entry<?, V>>(entries)将参数分配给您的字段。右侧都产生一个Set<Entry<?, V>>,其方式使编译器相信它意味着具有任何键类型和值类型的条目集合V

+0

非常感谢!这正是我想知道的。你的解释很有意义。 – tristan 2012-07-26 20:48:40

相关问题