Java 将引用类型作为参数传递并使用泛型

Java 将引用类型作为参数传递并使用泛型,java,generics,Java,Generics,我正在用java学习泛型,遇到了这个问题 我有一个天气界面地震和维吉尼亚天气是实现天气接口的两个类。这两个类都有一个静态方法-“parseData”,它解析来自atom提要的数据。主类中的getFeeds方法有一个参数“String type”,我用它来确定应该调用哪个类的方法。 有谁能帮助我理解泛型是否可以用来让代码更干净一点。我是否可以将类类型作为参数传递给该方法,并使用该类类型调用相应类中的parseData方法。 我试着去做 list.add(T.parseData((元素)nl.ite

我正在用java学习泛型,遇到了这个问题

我有一个天气界面<代码>地震和
维吉尼亚天气
是实现
天气
接口的两个类。这两个类都有一个静态方法-
“parseData”
,它解析来自atom提要的数据。主类中的
getFeeds
方法有一个参数
“String type”
,我用它来确定应该调用哪个类的方法。 有谁能帮助我理解泛型是否可以用来让代码更干净一点。我是否可以将类类型作为参数传递给该方法,并使用该类类型调用相应类中的
parseData
方法。 我试着去做
list.add(T.parseData((元素)nl.item(i))
但是得到:

类型T的方法parseData(元素)未定义

公共类主{
公共静态void main(字符串[]args){
列表地震=getFeeds(“http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_hour.atom“,”地震“);
List weather=getFeeds(“http://alerts.weather.gov/cap/va.php?x=0“,”天气“);
//获取地震数据
System.out.println(“地震数据”);
用于(地震e:地震)
System.out.printf(“%s\t%s\t%f\t%s\n”,(e.getDate())、e.getLocation()、e.getMagnitude()、e.getDetails());
//获取弗吉尼亚州的天气数据
System.out.println(“弗吉尼亚天气”);
对于(弗吉尼亚州大众汽车:天气)
System.out.printf(“%s\t%s\t%s\t%s\t%s\n”,vw.getUpdated(),vw.getTitle(),vw.getEvent(),vw.getEffect(),vw.getExpires());
}
私有静态列表getFeeds(字符串url,字符串类型){
列表=新的ArrayList();
试一试{
URL usgsUrl=新URL(URL);
URLConnection URLConnection=usgsUrl.openConnection();
HttpURLConnection httpConnection=(HttpURLConnection)urlConnection;
int response=httpConnection.getResponseCode();
if(response==HttpURLConnection.HTTP\u OK)
{
InputStream in=httpConnection.getInputStream();
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
Document Document=db.parse(in);
Element=document.getDocumentElement();
NodeList nl=element.getElementsByTagName(“条目”);
如果(nl!=null&&nl.getLength()>0)

对于(inti=0;i为什么不使用Java8的功能

private static <T> List<T> getFeeds(String url, Function<Element, T> parser) { 
   // [..snip..]
   for(int i =0 ; i<nl.getLength() ; i++) {
        list.add(parser.call((Element) nl.item(i)));
   }
   // [..snip..]
 }
私有静态列表getfeed(字符串url,函数解析器){
//[…剪断..]

对于(inti=0;i为什么不使用Java8的功能

private static <T> List<T> getFeeds(String url, Function<Element, T> parser) { 
   // [..snip..]
   for(int i =0 ; i<nl.getLength() ; i++) {
        list.add(parser.call((Element) nl.item(i)));
   }
   // [..snip..]
 }
私有静态列表getfeed(字符串url,函数解析器){
//[…剪断..]

对于(int i=0;i我将使用类型化工厂。首先创建一个接口:

interface WeatherDataFactory<T> {
    T parse(Element element);
}

顺便说一句,
NodeList#item(int)
的大多数实现执行起来就像一个链表,因为必须遍历整个列表才能得到元素n。如果列表很大,您的程序将非常慢。

我将使用类型化工厂。首先创建一个接口:

interface WeatherDataFactory<T> {
    T parse(Element element);
}

顺便说一句,
NodeList#item(int)
的大多数实现执行起来就像一个链表,因为必须遍历整个列表才能得到元素n。如果列表很大,您的程序将非常慢。

您可以使用类型化类

 public interface Weather<T>(){
        private static <T> List<T> getFeeds(String url, String type);
} 
公共接口天气(){
私有静态列表getfeed(字符串url、字符串类型);
} 
另一班呢

 public class EarthQuake implements Weather<EarthQuake> {

     }
公共类地震实现天气预报{
}

您可以使用类型化类

 public interface Weather<T>(){
        private static <T> List<T> getFeeds(String url, String type);
} 
公共接口天气(){
私有静态列表getfeed(字符串url、字符串类型);
} 
另一班呢

 public class EarthQuake implements Weather<EarthQuake> {

     }
公共类地震实现天气预报{
}

type==“地震”
euh这不好,RC的意思是你应该使用
equals()比较对象
-字符串是对象。Java泛型有点奇怪,因为类型参数实际上没有绑定到类,这就是为什么像JAXB这样的东西会使用Java.lang.class和泛型类型。实用的方法是定义一个接口,将文本转换为元素;深奥的方法是使用refleAction从类中获取类方法并调用它。谢谢RC和Thomas。我已将其更改为使用.equals()
type==“quakes”
euh这不好RC的意思是应该使用
equals()比较对象
-字符串是对象。Java泛型有点奇怪,因为类型参数实际上没有绑定到类,这就是为什么像JAXB这样的东西会使用Java.lang.class和泛型类型。实用的方法是定义一个接口,将文本转换为元素;深奥的方法是使用refleAction从类中获取类方法并调用它。谢谢RC和Thomas。我已将其更改为使用。equals()谢谢,如果使用NodeList.item(I)会很慢,请建议其他方法method@BKVPGoogle“DOM vs.SAX”。您正在使用DOM。如果使用NodeList,谢谢您。item(i)会很慢,你能推荐一个替代品吗method@BKVP谷歌“DOM vs.SAX”。你正在使用DOM。