GVKun编程网logo

Java泛型和varargs(java泛型和c++模板)

14

对于想了解Java泛型和varargs的读者,本文将提供新的信息,我们将详细介绍java泛型和c++模板,并且为您提供关于1.3版不支持Java泛型和注释(travis集成)、ArrayList.to

对于想了解Java泛型和varargs的读者,本文将提供新的信息,我们将详细介绍java泛型和c++模板,并且为您提供关于1.3版不支持Java泛型和注释(travis集成)、ArrayList.toArray()中的Java泛型、Java Varargs 可变参数使用、Java Varargs 可变参数用法详解的有价值信息。

本文目录一览:

Java泛型和varargs(java泛型和c++模板)

Java泛型和varargs(java泛型和c++模板)

我想用泛型和varargs实现一个函数。

public class Question {    public static <A> void doNastyThingsToClasses(Class<A> parent, Class<? extends A>... classes) {        /*** something here ***/    }    public static class NotQuestion {    }    public static class SomeQuestion extends Question {    }    public static void main(String[] args) {        doNastyThingsToClasses(Object.class, Question.class, SomeQuestion.class); // OK        doNastyThingsToClasses(Question.class, SomeQuestion.class); // OK        doNastyThingsToClasses(Question.class, Object.class, SomeQuestion.class); // compilation failure    }}

这里的意图是断言传递给该函数的所有参数都是扩展作为第一个参数给出的Class的Class对象。因此main方法的前两行将进行编译,而第三行将生成错误。

我的问题是: 为什么前两行会显示“类型安全性:为varargs参数创建了Class的通用数组”消息?

我在这里想念什么吗?

附加问题: 如何重新设计它以防止在调用“ doNastyThingsToClasses”函数的每一行上显示此警告?我可以将其更改为“
doNastyThingsToClasses(Class parent,Class <?> …
classes)”并摆脱警告,但这也删除了编译时的类型检查-如果我想这样做不是很好确保正确使用此功能。有更好的解决方案吗?

答案1

小编典典

与往常一样,Angelika
Langer的Java泛型常见问题解答对此进行了详细说明。(滚动到“为什么当我调用“
varargs”方法时,编译器有时会发出未经检查的警告?”-ID不能正常工作。)

基本上,您最终会以比正常情况更糟的方式丢失信息。Java泛型的另一个小问题是:

1.3版不支持Java泛型和注释(travis集成)

1.3版不支持Java泛型和注释(travis集成)

我正在尝试将我的github Java / PHP项目与travis-ci环境集成。这是我的travis配置:

language: javajdk:  - openjdk7  - oraclejdk7script: mvn test

下面是travis打印的输出:

Using worker: bluebox-linux-1.worker.travis-ci.org:travis-linux-9$ git clone --depth=50 --branch=master git://github.com/tkoomzaaskz/wealthy-laughing-duck.git tkoomzaaskz/wealthy-laughing-duckCloning into ''tkoomzaaskz/wealthy-laughing-duck''...remote: Counting objects: 458, done.remote: Compressing objects: 100% (263/263), done.remote: Total 458 (delta 156), reused 390 (delta 96)Receiving objects: 100% (458/458), 458.40 KiB, done.Resolving deltas: 100% (156/156), done.$ cd tkoomzaaskz/wealthy-laughing-duck$ git checkout -qf 47d1ef528f19ad6d01288ac9a3d4c550a79b14f4$ jdk_switcher use openjdk7Switching to OpenJDK7 (java-1.7.0-openjdk-amd64), JAVA_HOME will be set to /usr/lib/jvm/java-7-openjdk-amd64update-alternatives: error: no alternatives for apt.update-alternatives: error: no alternatives for mozilla-javaplugin.so.update-java-alternatives: plugin alternative does not exist: /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/IcedTeaPlugin.so$ java -versionjava version "1.7.0_15"OpenJDK Runtime Environment (IcedTea7 2.3.7) (7u15-2.3.7-0ubuntu1~12.04.1)OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)$ javac -versionjavac 1.7.0_15$ mvn install --quiet -DskipTests=true[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project wealthy-laughing-duck: Compilation failure: Compilation failure:[ERROR] /home/travis/build/tkoomzaaskz/wealthy-laughing-duck/src/main/java/com/blogspot/symfonyworld/wealthylaughingduck/dao/OutcomeDao.java:[19,8] error: generics are not supported in -source 1.3[ERROR] [ERROR] (use -source 5 or higher to enable generics)[ERROR] /home/travis/build/tkoomzaaskz/wealthy-laughing-duck/src/main/java/com/blogspot/symfonyworld/wealthylaughingduck/model/Income.java:[12,1] error: annotations are not supported in -source 1.3[ERROR] [ERROR] (use -source 5 or higher to enable annotations)[ERROR] /home/travis/build/tkoomzaaskz/wealthy-laughing-duck/src/main/java/com/blogspot/symfonyworld/wealthylaughingduck/model/User.java:[10,1] error: annotations are not supported in -source 1.3

输出显示我使用的Java版本太旧,无法使用注释和泛型。但是这些并不是什么新鲜事物,它们必须以某种方式得到支持(我想)。我一直在查看travis /
java文档,但没有找到有关Java版本的选项(因此我尝试使用其他jdks)。谁能指出我该在travis配置文件中放什么?


编辑:

在@hertzsprung之后,我运行mvn help:effective-pom并返回以下输出(实际上,注释sourcetarget属性均未定义maven-compiler-plugin-我该怎么办?):

<!-- ====================================================================== --><!--                                                                        --><!-- Generated by Maven Help Plugin on 2013-03-24T08:15:13                  --><!-- See: http://maven.apache.org/plugins/maven-help-plugin/                --><!--                                                                        --><!-- ====================================================================== --><!-- ====================================================================== --><!--                                                                        --><!-- Effective POM for project                                              --><!-- ''com.blogspot.symfony-world:wealthy-laughing-duck:jar:1.0-SNAPSHOT''    --><!--                                                                        --><!-- ====================================================================== --><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.blogspot.symfony-world</groupId>  <artifactId>wealthy-laughing-duck</artifactId>  <version>1.0-SNAPSHOT</version>  <name>wealthy-laughing-duck</name>  <url>http://maven.apache.org</url>  <build>    <sourceDirectory>/var/www/github/wealthy-laughing-duck/src/main/java</sourceDirectory>    <scriptSourceDirectory>src/main/scripts</scriptSourceDirectory>    <testSourceDirectory>/var/www/github/wealthy-laughing-duck/src/test/java</testSourceDirectory>    <outputDirectory>/var/www/github/wealthy-laughing-duck/target/classes</outputDirectory>    <testOutputDirectory>/var/www/github/wealthy-laughing-duck/target/test-classes</testOutputDirectory>    <resources>      <resource>        <mergeId>resource-0</mergeId>        <directory>/var/www/github/wealthy-laughing-duck/src/main/resources</directory>      </resource>    </resources>    <testResources>      <testResource>        <mergeId>resource-1</mergeId>        <directory>/var/www/github/wealthy-laughing-duck/src/test/resources</directory>      </testResource>    </testResources>    <directory>/var/www/github/wealthy-laughing-duck/target</directory>    <finalName>wealthy-laughing-duck-1.0-SNAPSHOT</finalName>    <pluginManagement>      <plugins>        <plugin>          <artifactId>maven-antrun-plugin</artifactId>          <version>1.6</version>        </plugin>        <plugin>          <artifactId>maven-assembly-plugin</artifactId>          <version>2.2-beta-4</version>        </plugin>        <plugin>          <artifactId>maven-clean-plugin</artifactId>          <version>2.3</version>        </plugin>        <plugin>          <artifactId>maven-compiler-plugin</artifactId>          <version>2.0.2</version>        </plugin>        <plugin>          <artifactId>maven-dependency-plugin</artifactId>          <version>2.1</version>        </plugin>        <plugin>          <artifactId>maven-deploy-plugin</artifactId>          <version>2.4</version>        </plugin>        <plugin>          <artifactId>maven-ear-plugin</artifactId>          <version>2.3.2</version>        </plugin>        <plugin>          <artifactId>maven-ejb-plugin</artifactId>          <version>2.2</version>        </plugin>        <plugin>          <artifactId>maven-install-plugin</artifactId>          <version>2.3</version>        </plugin>        <plugin>          <artifactId>maven-jar-plugin</artifactId>          <version>2.2</version>        </plugin>        <plugin>          <artifactId>maven-javadoc-plugin</artifactId>          <version>2.6.1</version>        </plugin>        <plugin>          <artifactId>maven-plugin-plugin</artifactId>          <version>2.8</version>        </plugin>        <plugin>          <artifactId>maven-rar-plugin</artifactId>          <version>2.2</version>        </plugin>        <plugin>          <artifactId>maven-release-plugin</artifactId>          <version>2.0-beta-8</version>        </plugin>        <plugin>          <artifactId>maven-resources-plugin</artifactId>          <version>2.3</version>        </plugin>        <plugin>          <artifactId>maven-site-plugin</artifactId>          <version>2.1</version>        </plugin>        <plugin>          <artifactId>maven-source-plugin</artifactId>          <version>2.0.4</version>        </plugin>        <plugin>          <artifactId>maven-surefire-plugin</artifactId>          <version>2.4.3</version>        </plugin>        <plugin>          <artifactId>maven-war-plugin</artifactId>          <version>2.1-beta-1</version>        </plugin>      </plugins>    </pluginManagement>    <plugins>      <plugin>        <artifactId>maven-help-plugin</artifactId>        <version>2.2</version>      </plugin>    </plugins>  </build>  <repositories>    <repository>      <snapshots>        <enabled>false</enabled>      </snapshots>      <id>central</id>      <name>Maven Repository Switchboard</name>      <url>http://repo1.maven.org/maven2</url>    </repository>  </repositories>  <pluginRepositories>    <pluginRepository>      <releases>        <updatePolicy>never</updatePolicy>      </releases>      <snapshots>        <enabled>false</enabled>      </snapshots>      <id>central</id>      <name>Maven Plugin Repository</name>      <url>http://repo1.maven.org/maven2</url>    </pluginRepository>  </pluginRepositories>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>    <dependency>      <groupId>org.apache.thrift</groupId>      <artifactId>libthrift</artifactId>      <version>0.9.0</version>    </dependency>    <dependency>      <groupId>org.slf4j</groupId>      <artifactId>slf4j-api</artifactId>      <version>1.7.3</version>    </dependency>    <dependency>      <groupId>org.hibernate</groupId>      <artifactId>hibernate-core</artifactId>      <version>4.1.10.Final</version>    </dependency>    <dependency>      <groupId>mysql</groupId>      <artifactId>mysql-connector-java</artifactId>      <version>5.1.24</version>    </dependency>  </dependencies>  <reporting>    <outputDirectory>/var/www/github/wealthy-laughing-duck/target/site</outputDirectory>  </reporting>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties></project>[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESSFUL[INFO] ------------------------------------------------------------------------[INFO] Total time: 16 seconds[INFO] Finished at: Sun Mar 24 20:15:13 CET 2013[INFO] Final Memory: 11M/60M[INFO] ------------------------------------------------------------------------

这是我的原始pom.xml内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.blogspot.symfony-world</groupId>    <artifactId>wealthy-laughing-duck</artifactId>    <version>1.0-SNAPSHOT</version>    <packaging>jar</packaging>    <name>wealthy-laughing-duck</name>    <url>http://maven.apache.org</url>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>3.8.1</version>            <scope>test</scope>        </dependency>        <dependency>            <groupId>org.apache.thrift</groupId>            <artifactId>libthrift</artifactId>            <version>0.9.0</version>        </dependency>        <dependency>            <artifactId>slf4j-api</artifactId>            <groupId>org.slf4j</groupId>            <type>jar</type>            <version>1.7.3</version>        </dependency>        <dependency>            <artifactId>hibernate-core</artifactId>            <groupId>org.hibernate</groupId>            <type>jar</type>            <version>4.1.10.Final</version>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.24</version>        </dependency>    </dependencies></project>

答案1

小编典典

请尝试在pom.xml中为Maven构建配置包含以下代码。我和自己有同样的问题,这似乎对我有用:

<build>    <pluginManagement>         <plugins>             <plugin>                 <artifactId>maven-compiler-plugin</artifactId>                 <version>2.3.2</version>                 <configuration>                     <source>1.6</source>                     <target>1.6</target>                     <compilerArgument></compilerArgument>                 </configuration>             </plugin>         </plugins>    </pluginManagement></build>

ArrayList.toArray()中的Java泛型

ArrayList.toArray()中的Java泛型

假设您有一个arraylist定义如下:

ArrayList<String> someData = new ArrayList<>();

稍后在代码中,由于泛型,您可以这样说:

String someLine = someData.get(0);

而且编译器完全知道它将得到一个字符串。是的仿制药!但是,这将失败:

String[] arrayOfData = someData.toArray();

toArray()将始终返回对象数组,而不是已定义的泛型数组。为什么该get(x)方法知道返回的内容,但toArray()默认为Objects?

答案1

小编典典

如果你看一下执行toArray(T[] a)的的ArrayList
类,它是这样的:

public <T> T[] toArray(T[] a) {    if (a.length < size)        // Make a new array of a''s runtime type, but my contents:        return (T[]) Arrays.copyOf(elementData, size, a.getClass());    System.arraycopy(elementData, 0, a, 0, size);    if (a.length > size)        a[size] = null;    return a;}

这种方法的问题是您需要传递相同泛型的数组。现在考虑如果此方法不带任何参数,则实现将类似于以下内容:

public <T> T[] toArray() {    T[] t = new T[size]; // compilation error    return Arrays.copyOf(elementData, size, t.getClass());}

但是这里的问题是, 您不能在Java中创建通用数组, 因为编译器不知道确切T代表什么。换句话说 在Java中不允许
创建非可校正类型的数组
(JLS§4.7)。


数组存储异常
(JLS§10.5)中的另一个重要报价:

如果数组的组件类型不可修改(第4.7节),则Java虚拟机将无法执行上一段所述的存储检查。
这就是为什么禁止使用不可修改元素类型的数组创建表达式的原因(第15.10.1节)。

这就是Java提供重载版本的原因toArray(T[]a)

我将重写toArray()方法以告诉它它将返回E数组。

因此toArray(),您应该使用而不是覆盖toArray(T[] a)

无法从Java
Doc
创建类型参数的实例可能对您也很有趣。

Java Varargs 可变参数使用

Java Varargs 可变参数使用

Java1.5 提供了一个叫varargs的新功能,就是可变长度的参数。

"Varargs"是 “variable number of arguments”的意思。有时候也被简单的称为 “variable arguments”。

定义实参个数可变的方法:只要在一个形参的"类型"与"参数名"之间加上三个连续的"."(即"...",英文里的句中省略号),就可以让它和不确定个实参相匹配。

以下实例创建了 sumvarargs() 方法来统计所有数字的值。

我们在这里的 Main 方法中添加了 new int[]{10, 12, 33, 7} 4 个参数,实际上你可以在这里持续添加不同的参数,在计算 sum 的方法中都可以根据你添加的参数来进行处理。

GIT

请参考 GitHub 上的源码代码:

https://github.com/cwiki-us/java-tutorial/blob/master/src/main/java/com/ossez/lang/tutorial/usecases/VarargsCase.java

SRC

package com.ossez.lang.tutorial.usecases;  
  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
  
/\*\*  
 \* variable arguments use case \*/public class VarargsCase {  
    private static final Logger logger \= LoggerFactory.getLogger(VarargsCase.class);  
  
  /\*\*  
 \* sumVarargs \* \* @param intArrays  
  \* @return  
  \*/  
  static int sumVarargs(int... intArrays) {  
        int sum, i;  
  sum = 0;  
 for (i = 0; i < intArrays.length; i++) {  
            sum += intArrays\[i\];  
  }  
        return (sum);  
  }  
  
    /\*\*  
 \* Main Function \* \* @param args  
  \*/  
  public static void main(String args\[\]) {  
        int sum = 0;  
  sum = sumVarargs(new int\[\]{10, 12, 33, 7});  
  logger.debug("The Sum of the arrays: {}", sum);  
  }  
}

OUTPUT

程序运行的输出结果为:

2020/01/27 14:33:52 DEBUG [com.ossez.lang.tutorial.usecases.VarargsCase] - The Sum of the arrays: 62

Java Varargs 可变参数用法详解

Java Varargs 可变参数用法详解

Java1.5 提供了一个叫varargs的新功能,就是可变长度的参数。

"Varargs"是 “variable number of arguments”的意思。有时候也被简单的称为 “variable arguments”。

定义实参个数可变的方法:只要在一个形参的"类型"与"参数名"之间加上三个连续的"."(即"...",英文里的句中省略号),就可以让它和不确定个实参相匹配。

以下实例创建了 sumvarargs() 方法来统计所有数字的值。

我们在这里的 Main 方法中添加了 new int[]{10,12,33,7} 4 个参数,实际上你可以在这里持续添加不同的参数,在计算 sum 的方法中都可以根据你添加的参数来进行处理。

GIT

请参考 GitHub 上的源码代码:

https://github.com/cwiki-us/java-tutorial/blob/master/src/main/java/com/ossez/lang/tutorial/usecases/VarargsCase.java

SRC

package com.ossez.lang.tutorial.usecases;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * variable arguments use case
 */
public class VarargsCase {
  private static final Logger logger = LoggerFactory.getLogger(VarargsCase.class);

  /**
   * sumVarargs
   *
   * @param intArrays
   * @return
   */
  static int sumVarargs(int... intArrays) {
    int sum,i;
    sum = 0;
    for (i = 0; i < intArrays.length; i++) {
      sum += intArrays[i];
    }
    return (sum);
  }

  /**
   * Main Function
   *
   * @param args
   */
  public static void main(String args[]) {
    int sum = 0;
    sum = sumVarargs(new int[]{10,7});
    logger.debug("The Sum of the arrays: {}",sum);
  }
}

OUTPUT

程序运行的输出结果为:

2020/01/27 14:33:52 DEBUG [com.ossez.lang.tutorial.usecases.VarargsCase] - The Sum of the arrays: 62

扩展学习

Java 实例 - Varargs 可变参数使用

ava1.5提供了一个叫varargs的新功能,就是可变长度的参数。

"Varargs"是"variable number of arguments"的意思。有时候也被简单的称为"variable arguments"

定义实参个数可变的方法:只要在一个形参的"类型"与"参数名"之间加上三个连续的"."(即"...",英文里的句中省略号),就可以让它和不确定个实参相匹配。

以下实例创建了 sumvarargs() 方法来统计所有数字的值:

Main.java 文件

public class Main {
  static int sumvarargs(int... intArrays){
    int sum,i;
    sum=0;
    for(i=0; i< intArrays.length; i++) {
      sum += intArrays[i];
    }
    return(sum);
  }
  public static void main(String args[]){
    int sum=0;
    sum = sumvarargs(new int[]{10,33});
    System.out.println("数字相加之和为: " + sum);
  }
}

以上代码运行输出结果为:

数字相加之和为: 55

以上就是本次介绍的全部相关知识点,如果大家有任何补充内容可以联系我们小编。

今天关于Java泛型和varargsjava泛型和c++模板的介绍到此结束,谢谢您的阅读,有关1.3版不支持Java泛型和注释(travis集成)、ArrayList.toArray()中的Java泛型、Java Varargs 可变参数使用、Java Varargs 可变参数用法详解等更多相关知识的信息可以在本站进行查询。

本文标签: