内部类的Java类型捕获

内部类的Java类型捕获,java,types,Java,Types,我有以下Java类(在这种形式中显然是无用的): public class EntrySet<T> { public static class Entry<T> { T obj; } private final Set<Entry<T>> set; public EntrySet() { this.set = Sets.newHashSet(); } publi

我有以下Java类(在这种形式中显然是无用的):

public class EntrySet<T> {

    public static class Entry<T> {
        T obj;
    }

    private final Set<Entry<T>> set;

    public EntrySet() {
        this.set = Sets.newHashSet();
    }

    public Set<Entry<T>> getEntries() {
        return set;
    }
}
公共类入口集{
公共静态类条目{
T-obj;
}
私有最终集;
公共入口集(){
this.set=Sets.newHashSet();
}
公共集合getEntries(){
返回集;
}
}
给定此类,以下内容不可编译:

EntrySet<?> entrySet = new EntrySet<SomeClass>();
Set<EntrySet.Entry<?>> entries = entrySet.getEntries();
EntrySet EntrySet=new EntrySet();
Set entrySet=new entrySet();
Set tmp=entrySet.getEntries();

Set删除
entrySet
您正试图将
Set
分配给
Set entrySet=new entrySet();
fn(入口集);
...
私有静态void fn(EntrySet EntrySet){
Set entries=entrySet.getEntries();

删除
entrySet
您正试图将
集合
分配给
集合entrySet=new entrySet();
fn(入口集);
...
私有静态void fn(EntrySet EntrySet){
Set entries=entrySet.getEntries();

无界通配符
类似于所有泛型类型的超级类型。它类似于对象类对所有java类的作用。对无界通配符引用可以执行的唯一操作是那些采用“null”的操作(如果参数引用中使用了
参数)或者那些返回“对象”(如果返回类型引用中使用了
参数)的对象。因此,如果返回类型对象的引用,代码将编译

 class EntrySet<T> {

    public static class Entry<T> {
        T obj;
    }

    private final java.util.Set<Entry<T>> set;

    public EntrySet() {
        this.set = new java.util.HashSet();
    }

    public java.util.Set<Entry<T>> getEntries() {
        return set;
    }

    public static void main(String [] args){
        EntrySet<?> entrySet = new EntrySet<SomeClass>();

    //java.util.Set<EntrySet.Entry<?>> entries = entrySet.getEntries(); // Error

         Object o = entrySet.getEntries();         // OK !
    }
}

class SomeClass{}
类入口集{
公共静态类条目{
T-obj;
}
私有最终java.util.Set;
公共入口集(){
this.set=new java.util.HashSet();
}
public java.util.Set getEntries(){
返回集;
}
公共静态void main(字符串[]args){
EntrySet EntrySet=new EntrySet();

//java.util.Set无界通配符
类似于所有泛型类型的超级类型。它类似于对象类对所有java类的作用。可以对无界通配符引用执行的唯一操作是那些采用“null”的操作(如果参数引用中使用了
参数)或者那些返回“对象”(如果返回类型引用中使用了
参数)的对象。因此,如果返回类型对象的引用,代码将编译

 class EntrySet<T> {

    public static class Entry<T> {
        T obj;
    }

    private final java.util.Set<Entry<T>> set;

    public EntrySet() {
        this.set = new java.util.HashSet();
    }

    public java.util.Set<Entry<T>> getEntries() {
        return set;
    }

    public static void main(String [] args){
        EntrySet<?> entrySet = new EntrySet<SomeClass>();

    //java.util.Set<EntrySet.Entry<?>> entries = entrySet.getEntries(); // Error

         Object o = entrySet.getEntries();         // OK !
    }
}

class SomeClass{}
类入口集{
公共静态类条目{
T-obj;
}
私有最终java.util.Set;
公共入口集(){
this.set=new java.util.HashSet();
}
public java.util.Set getEntries(){
返回集;
}
公共静态void main(字符串[]args){
EntrySet EntrySet=new EntrySet();

//java.util.setEntrySet=new EntrySet();?这只是一些伪代码来澄清问题。这当然可以,但在我的例子中,我只有一个
EntrySet
。你试过EntrySet EntrySet=new EntrySet()吗?这只是一些使问题清晰的伪代码。这当然会起作用,但在我的情况下,我只有一个
入口集
。你不能添加
入口集。入口
集合我不确定我是否理解了这个问题。正如@miserablevable所说,你不能插入
集合。我相信你可以添加到
集合中
也会起作用(某些目的).A
Set@MiserableVariable但是我们并不是在谈论
Set>
,这是一个完全不同的问题。你不能添加
EntrySet。Entry
SetI我不确定我是否理解这个问题。正如@MiserableVariable所说,你不能插入
SetI我相信你可以添加到
Set>
也会起作用(对于某些目的)。A
Set@MiserableVariable但我们不是在谈论
Set>
,这是一个完全不同的问题。
 class EntrySet<T> {

    public static class Entry<T> {
        T obj;
    }

    private final java.util.Set<Entry<T>> set;

    public EntrySet() {
        this.set = new java.util.HashSet();
    }

    public java.util.Set<Entry<T>> getEntries() {
        return set;
    }

    public static void main(String [] args){
        EntrySet<?> entrySet = new EntrySet<SomeClass>();

    //java.util.Set<EntrySet.Entry<?>> entries = entrySet.getEntries(); // Error

         Object o = entrySet.getEntries();         // OK !
    }
}

class SomeClass{}