Java泛型:从泛型方法中返回持有对象

3
在接下来的内容中:
public interface SomeInteface<A, B> {  
    public B doSomething(A a);  
} 

我希望实现这样一个版本:方法doSomething返回参数a
我尝试使用Holder类;

class Holder<A> {  
     public A value;  
     public(A a){this.value = a;}  
}

并返回Holder。然而,我不确定如何定义SomeInterface的实现类,以便我能够这样做。

以下内容甚至无法编译:

public class SomeImplementation<X> implements SomeInterface<T> {  

  private class Holder<A> {  
    public A value;  

    public class Holder<A>{  
      public A value;  
      public(A a){this.value = a;}  
    } 
  }   

  class Implementation<A, Holder<A>> implements SomeInterface<A, Holder<A>>{    
    public Holder<A> doSomething(A a){  
      //do stuff      
      return new Holder(a);  
    }   
  }      
}       

我在这里搞砸了什么?


什么是编译错误? - unholysampler
2
为什么在另一个Holder类中有一个Holder内部类?这些类对代码有什么贡献?你不能只使用通用类吗? - RNJ
@unholysampler:Eclipse 在 class Implementation<A, Holder<A>> 中显示红色问号。 - Cratylus
1
在泛型类型的参数中指定<A,Holder<A>>是没有意义的;你应该在类声明中指定参数名称,在实际构造这样的对象时指定泛型类型参数。你需要像这样的东西:class Implementation<A, B> implements SomeInterface<A, B>,然后稍后声明一个变量,如Implementation<String, Holder<String>> myImpl = new Implementation<>(); - dlev
你可能想要避免使用公共字段。 - Daniel Ryan
显示剩余5条评论
2个回答

2

它需要被

class Implementation<A> implements SomeInteface<A, Holder<A>>{    
          public Holder<A> doSomething(A a){  
              //do stuff  
              return new Holder<A>(a);  
          }     

   } 

在classname中定义泛型变量及其限制条件,不需要使用Holder变量。


  1. 你正在使用Holder作为原始类型。应该是new Holder<A>(a)
  2. “你也可以这样做…”无法编译。
- newacct
为什么要使用Holder类?请看我的回答。 - herman

2
我不明白为什么你要把它搞得这么难。你说:
引用: 我想实现一个版本,在这个版本中,方法 doSomething 返回参数 a。
好的,你可以这样做:
public class SomeImplementation<A> implements SomeInterface<A, A> {
    public A doSomething(A a) {
        // do stuff
        return a;
    }
}

不需要Holder类。

接口SomeInterface对类型参数没有任何限制,因此它们可以是相同的,没有任何理由不能这样做。

或者,您可以允许您的实现使用两种不同的类型A和B进行参数化,其中A扩展B(在某些情况下可能很有用):

public class SomeImplementation<A extends B, B> implements SomeInterface<A, B> {
    public B doSomething(A a) {
        // do stuff
        return a;
    }
}

那么 SomeInterface<A, A>SomeInterface<A, B> 是一样的吗? - Cratylus
这是相同的接口,只是具有不同的类型参数。 - herman
那么原始声明为 SomeInteface<A,B> 并不会对实现类的声明造成任何限制,可以是 Implementation<A,B>Implementation<A,A>Implementation<B,B>Implementation<B,A> - Cratylus
当然,你甚至可以这样说:public class SomeImplementation<X, Y> implements SomeInterface<X, Y> 或者 public class SomeImplementation implements SomeInterface<String, Long>。接口声明中的A和B只是类型参数的名称。这些名称只在该接口内有意义,就像方法参数的名称在方法外部没有任何意义一样。 - herman
你推荐一些好的资源吗?我偶尔会对这些符号感到困惑。 - Cratylus
不是很相关,但我最近写了一篇关于在数据模型中使用泛型来处理数据库ID的文章。这是一个相对简单的案例,并附有一些解释,可能会提供一些有关泛型使用的见解。您可以在这里找到它:Java data model with generic IDs。如果有任何不清楚的地方或者您对文章内容有疑问,可以在那里留言。 - herman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接