Java 从集合解析<;A型>;设置<;类型B>;

Java 从集合解析<;A型>;设置<;类型B>;,java,generics,Java,Generics,我有一个奇怪的问题,我希望有人能帮助我。 我正在使用Java 我从一个方法收到一个集合。这个TypeA正是我想要的,但是我想为它添加更多的功能,以提高代码的清洁度 在C#中,我可以编写扩展方法,但我认为Java没有类似的功能,因此我想创建一个新类型TypeB,它包含一个TypeA变量并执行我想要的额外功能(类似于包装器/适配器)。但问题是: 我做不到 Set<TypeB> mySet = myMethod(); Set mySet=myMethod(); 或 Set mySet=

我有一个奇怪的问题,我希望有人能帮助我。 我正在使用Java

我从一个方法收到一个集合。这个TypeA正是我想要的,但是我想为它添加更多的功能,以提高代码的清洁度

在C#中,我可以编写扩展方法,但我认为Java没有类似的功能,因此我想创建一个新类型TypeB,它包含一个TypeA变量并执行我想要的额外功能(类似于包装器/适配器)。但问题是:

我做不到

Set<TypeB> mySet = myMethod();
Set mySet=myMethod();

Set mySet=(Set)myMethod();
什么才是完美的呢

Set<TypeB> mySet = new Set<TypeB>(myMethod());
Set mySet=newset(myMethod());
但是Set是一种Java类型,所以我不能向它添加构造函数

我如何才能以干净的方式解析它? 如果我添加一个方法,如

Set<TypeB> mySet = parse(myMethod());
Set mySet=parse(myMethod());
我必须遍历myMethod中的所有项,这不会非常有性能

有没有比创建此方法更好的解决方案

谢谢, 奥斯卡

只有这样的smt

Set<TypeB> parse(Set<TypeA> old){
   Set<TypeB> res = new HashSet<TypeB>();
   for(TypeA a : old) res.add(new TypeB(a));
   return res;
}
Set解析(Set old){
Set res=新的HashSet();
对于(类型a:旧)资源,添加(新类型B(a));
返回res;
}
或者创建自己的集。

只有这样的smt

Set<TypeB> parse(Set<TypeA> old){
   Set<TypeB> res = new HashSet<TypeB>();
   for(TypeA a : old) res.add(new TypeB(a));
   return res;
}
Set解析(Set old){
Set res=新的HashSet();
对于(类型a:旧)资源,添加(新类型B(a));
返回res;
}

或者创建您自己的集合。

如果您不是通过继承TypeA而是通过使用函数(静态方法)添加功能,该怎么办

因此,不是:

public class TypeB {
    TypeA self;
    public void Frobnicate(int foo) {...}
}
写:

public class TypeAUtils {
    public static void Frobnicate(TypeA self, int foo) {...}
}
无论如何,C#扩展方法只是这种技术的语法糖

这是我最喜欢的设计模式之一。我称之为“功能”,它被严重低估了-P


如果您不能这样做(因此您也不能使用扩展方法),那么您必须向TypeA添加状态,在这种情况下,您必须为集合中的每个对象分配更多内存,这意味着您无法避免迭代。

如果您不是通过继承TypeA而是通过使用函数来添加功能,该怎么办(静态方法):

因此,不是:

public class TypeB {
    TypeA self;
    public void Frobnicate(int foo) {...}
}
写:

public class TypeAUtils {
    public static void Frobnicate(TypeA self, int foo) {...}
}
无论如何,C#扩展方法只是这种技术的语法糖

这是我最喜欢的设计模式之一。我称之为“功能”,但它被严重低估了。:-p

如果您不能这样做(因此您也不能使用扩展方法),那么您必须将状态添加到TypeA,在这种情况下,您必须为集合中的每个对象分配更多内存,这意味着您无法避免迭代。

编辑

(根据OP下面的澄清意见进行了修订。)

让我们假设
B
有一个构造函数

    public B(A a) { ... }
这将创建一个
B
适配
a
实例。然后从
集合创建
集合的最简单方法是:

    Set<A> aset = ...
    Set<B> bset = new HashSet<B>(aset.size());
    for (A a : aset) {
        bset.add(new B(a));
    }
Set aset=。。。
Set bset=newhashset(aset.size());
对于(A:aset){
B增加(新B(a));
}
Apache Commons集合和Guava集合包括可以将一个类的集合转换为另一个类的集合的基础设施,但是对于这样简单的东西来说,它们是多余的。(但是如果你真的想走这条路,Guava会更好,因为API可以识别泛型。)

EDIT

(根据OP下面的澄清意见进行了修订。)

让我们假设
B
有一个构造函数

    public B(A a) { ... }
这将创建一个
B
适配
a
实例。然后从
集合创建
集合的最简单方法是:

    Set<A> aset = ...
    Set<B> bset = new HashSet<B>(aset.size());
    for (A a : aset) {
        bset.add(new B(a));
    }
Set aset=。。。
Set bset=newhashset(aset.size());
对于(A:aset){
B增加(新B(a));
}

ApacheCommons集合和Guava集合包括可以将一个类的集合转换为另一个类的集合的基础设施,但是对于这样简单的东西来说,它们太过简单了(但是如果你真的想走这条路,Guava会更好,因为API可以识别泛型)

是的,这正是我的解析方法,但出于性能原因,我不想遍历所有项目。但我认为这是不可能的:(@Oscar:在这种情况下,试试implementset。与创建新对象的成本相比,迭代的性能微不足道。即使这样,也可能很小。顺便说一句:大多数允许您避免使用循环的实用程序都会为您使用循环。也就是说,这是一种错觉。是的,这正是我拥有的解析方法,但我不想迭代所有的方法出于性能方面的原因,这些项目是不可能的。但我认为这是不可能的:(@Oscar:在这种情况下,试试implementset。与创建新对象的成本相比,迭代的性能微不足道。即使这样也可能很小。顺便说一句:大多数允许您避免使用循环的实用程序都会为您使用循环。也就是说,这是一种错觉。您的意思是“转换”而不是“解析”?不完全是“转换”意味着这些对象在某种程度上是相关的(例如,层次结构),而不是。你是说“转换”而不是“解析”吗?不完全是说,“转换”意味着这些对象在某种程度上是相关的(例如,层次结构)事实上,我认为他想要的是将集合转换为集合,其中B是a的子类型。嗨,对不起,如果这很难理解,我下次会努力改进:)。我有一个类型a,它是第三方类型,一个类型B,我制作并包含一个类型a变量,但它不是子类型,它是一个适配器。我想从一个集合创建这个集合,但我不知道如何创建。嗨,是的,这也是一种可能性,也是我以前的解决方案。之后,我使用了luqui的解决方案。tks!:)事实上,我认为他想要的是把集合转换成集合,其中B是a的一个子类型。嗨,对不起,如果这很难理解,我会