在Java泛型中创建类型对象
我们是否可以在Java泛型中创建一个类型类对象,比如在Java泛型中创建类型对象,java,generics,interface,Java,Generics,Interface,我们是否可以在Java泛型中创建一个类型类对象,比如tt=new T() 这是我的密码 public class Graph<T extends NeighbourInt<T>> { Map<String, List<T>> adjecencyList; public Graph() { adjecencyList = new HashMap<>(); } public void a
tt=new T()代码>
这是我的密码
public class Graph<T extends NeighbourInt<T>> {
Map<String, List<T>> adjecencyList;
public Graph() {
adjecencyList = new HashMap<>();
}
public void addEdge(String vertex1, String vertex2, int weight) {
if (adjecencyList.containsKey(vertex1)) {
List<T> neg = adjecencyList.get(vertex1);
neg.add(new T (vertex2, weight));
} else {
List<T> neg = new ArrayList<>();
neg.add(new T(vertex2, weight));
adjecencyList.put(vertex1, neg);
}
}
}
公共类图{
地图邻接列表;
公共图(){
adjencylist=新HashMap();
}
公共void addEdge(字符串顶点1、字符串顶点2、整数权重){
if(邻接列表containsKey(顶点1)){
List neg=adjacencylist.get(顶点1);
负添加(新T(顶点2,重量));
}否则{
List neg=new ArrayList();
负添加(新T(顶点2,重量));
邻接列表放置(顶点1,负);
}
}
}
我的邻居界面
public interface NeighbourInt<T> extends Comparable<T> {
public String getVertex();
public void setVertex(String vertex);
public int getWeight();
public void setWeight(int weight);
}
公共接口邻域扩展{
公共字符串getVertex();
公共无效集合顶点(字符串顶点);
public int getWeight();
公共空隙设定重量(内部重量);
}
是否有可能启动一个对象,如new T();在Java泛型中?否。实际上,T
是泛型类型的参数,而不是类
例如:
public interface NeighbourInt extends Comparable<NeighbourInt> {
// ...
}
参数化的Compariable
相当于具有以下方法的接口:
int compareTo(NeighbourInt o);
因此,上面声明的邻域
继承了该方法
编辑:将泛型类看作是一个“类工厂”的类,一个制造其他类的类。因此,只有当您需要有许多不同类型的“制造”类作为参数时,才能创建泛型类
因此宣布:
public class Graph<T extends NeighbourInt> {
// ...
}
没有,还没有(又是因为擦除)
但是,Graph
的构造函数可以接受一个生成器,该生成器从(String,int)创建T
;当需要创建新的T
时,调用此生成器
在Java8中,您可以
public Graph( BiFunction<String,Integer,T> generator )
new Graph<>( Foo::new )
你能行
public Graph( BiFunction<String,Integer,T> generator )
new Graph<>( Foo::new )
新图形(Foo::new)
No这是不可能的,因为在运行时,泛型会消失。您可以使用Class.newInstance
来执行此操作您不想创建新的T
实际上只想使用传入的参数tn
。i、 e.neg.add(n)
很抱歉出错,我更正为addEdge(字符串顶点1,字符串顶点2,int-weight){…}。我想添加一个T类型的新对象来实现邻接属性。好的,让我再次澄清。您不需要addEdge(字符串顶点1、字符串顶点2、整数权重)
您想要的是您原来拥有的。让打电话的人为你做一个新的T
。是的,我最初试过。但我想知道是否有一种方法可以使构造函数也可以安全地用作新的T()或新的T(字符串顶点,int-weight)。从所有的答复来看,我认为没有这样的办法。感谢您的快速回复:)是的,这是真的:)但我想在列表AdjencyList中添加一个新的类型T对象,它可以包含类型T的对象。有可能吗?可能您过度使用了泛型。为什么需要将Graph
类声明为泛型类型?更新了我的答案。adjcencyList实际上只使用邻接方法。但是有一种新类型的have类,它也只有很少的方法。我想我明白你的意思了。如果有一个包含新方法的decorator类,并且实现了邻居接口,那就太好了。Thanx的回答是:)1加上Java8的东西。我认为这有助于改善这种情况。感谢您的回复:)@sandaru.ny-好吧,这个问题不需要java8;在Java7中它只会更加冗长。
public Foo(String, int)
new Graph<>( Foo::new )