小编Bev*_*vor的帖子

在泛型中扩展的超级和默默无闻的有用示例?

我知道关于这个话题有很多问题,但遗憾的是他们无法帮助我消除我的晦涩.首先,看下面的例子.我不明白,为什么以下"添加"-method someCage.add(rat1)不起作用并以下列异常中止:

线程"main"中的异常java.lang.Error:未解决的编译问题:Cage类型中的方法add(捕获#2-of?extends Animal)不适用于参数(Rat)

Cage<Rat>是不一样的原因Cage<Animal>吗?如果是,我在这个例子中不理解它,所以我不确定编译器到底做了什么.这是代码示例:

package exe;

import cage.Cage;
import animals.Animal;
import animals.Ape;
import animals.Lion;
import animals.Rat;

public class Main {

    public static void main(String[] args) {
        Lion lion1 = new Lion(true, 4, "Lion King", 8);
        Lion lion2 = new Lion(true, 4, "King of Animals", 9);
        Ape ape1 = new Ape(true, 2, "Gimpanse", true);
        Ape ape2 = new Ape(true, 2, "Orang Utan", true);
        Rat rat1 = new Rat(true, 4, "RatBoy", true);
        Rat rat2 = new …
Run Code Online (Sandbox Code Playgroud)

java generics

3
推荐指数
2
解决办法
3270
查看次数

warning(junit.framework.TestSuite $ 1):Maven执行Android Test时构造函数中的异常

我设置了Maven的Android测试项目,并按照此处的说明进行操作.基本上我能够设置测试项目,甚至模拟器被识别,但我仍然无法在执行mvn install时在Maven中运行测试(在Eclipse中).如果我尝试执行它,我会收到以下错误:

测试失败:警告(junit.framework.TestSuite $ 1):构​​造函数中的异常:testPersistAndRead(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构​​造函数中的异常:testFileNotExists(java.lang .RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构​​造函数中的异常:testCreateFiles(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构​​造函数中的异常:testFilesExist(java.lang.RuntimeException:Stub!(..)warning(junit.framework.TestSuite $ 1):构​​造函数中的异常:testAndroidTestCaseSetupProperly(java.lang.RuntimeException:Stub!(..)

surfire的输出告诉我它嵌套在AndroidTestCase中:

junit.framework.AssertionFailedError:构造函数中的异常:testPersistAndRead(java.lang.RuntimeException:Stub!at android.test.AndroidTestCase.(AndroidTestCase.java:5)[...]

这是我尝试运行的测试.

public class PersistenceManagerTest extends AndroidTestCase {

    private final String FILENAME_PREFIX = "test.";

    protected void setUp() throws Exception {
        super.setUp();
        deleteInternalStorageFile();

        MockContentResolver resolver = new MockContentResolver();
        RenamingDelegatingContext renamingDelegatingContext = new RenamingDelegatingContext(new MockContext(), getContext(), FILENAME_PREFIX);
        Context context = new IsolatedContext(resolver, renamingDelegatingContext);

        setContext(context);
    }

    //AfterClass
    protected void tearDown() {
        deleteInternalStorageFile();
    }

    public void testPersistAndRead() throws IOException {
        String testData = "foobar";

        PersistenceManager.persist(testData, FileType.JSONDATA); …
Run Code Online (Sandbox Code Playgroud)

junit android maven android-testing

2
推荐指数
1
解决办法
4924
查看次数

为什么浮动是双重铸造的不精确,双重浮动不是?

我知道浮动点变量在投射时会失去精度.但是我不明白的是,为什么从较小的原语到较大的原语的演员是不确定的,反之亦然.我会理解,如果它发生在从double到float,但它是另一种方式.为什么会这样?

查看这两个测试的结果:

@Test
public void castTwoPrimitiveDecimalsUnpreciseToPrecise()
{
    float var1 = 6.2f;
    double var2 = var1;

    assertThat(var2, is(6.2d)); //false, because it's 6.199999809265137
}

@Test
public void castTwoPrimitiviesDecimalsPreciseToUnpresice()
{
    double var1 = 7.6d;
    float var2 = (float)var1;

    assertThat(var2, is(7.6f)); //true
}
Run Code Online (Sandbox Code Playgroud)

java floating-point double casting

2
推荐指数
1
解决办法
293
查看次数

为什么我需要在 byte 和 short 上显式地转换 char 原语?

关于原语:当我从较小的类型转换为较大的类型时,转换是隐式的,当我从较大的类型转换为较小的类型时,我需要显式地转换原语,由于数据丢失,这很明显。但有一点我不明白。在某些情况下(字节和短),当我向上或向下转换为 char 时,我总是需要在两个方向上显式转换,尽管字节(8 位)适合字符(16 位)?

(另见http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

看我的例子...

public class CastingTest
{
    public static void main(String[] args)
    {
        //casting from smaller to bigger types
        short c = 13;
        int d = c;

        byte f = 34;
        short g = f;

        byte h = 20;
        long i = h;

        byte var03 = 6;
        double var04 = var03;   

        //casting from bigger to smaller types
        int j = 12;
        short k = (short)j;

        long m = 56;
        int n = (int)m;

        double …
Run Code Online (Sandbox Code Playgroud)

java byte casting short char

2
推荐指数
1
解决办法
2733
查看次数

Maven:如何通过设置使用 settings.xml 中的属性。字首?

当我以这种方式向 settings.xml 添加设置时...

  <profiles>
    <profile>
        <id>outsorced-project-properties</id>
        <properties>
            <key.password>mysecretpassword</key.password>
        </properties>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>outsorced-project-properties</activeProfile>
  </activeProfiles>
Run Code Online (Sandbox Code Playgroud)

..然后我可以将 ${key.password} 与我的项目的 pom.xml 一起使用。这有效,但似乎有点不方便。

MavenPropertiesGuide 中,您可以通过设置使用 settings.xml 中的设置。字首。

本地用户设置

类似地,可以使用带有设置的属性名称来引用用户 settings.xml 中的值。字首。

${settings.localRepository} refers to the path of the user's local repository
Run Code Online (Sandbox Code Playgroud)

但这似乎对我不起作用。至少我不知道如何在 settings.xml 中定义它们。我试图在 settings.xml 的 settings 标签内或 settings 标签内的 properties 标签内定义它们,等等,但这些属性从未被识别。我理解错了吗?

maven

2
推荐指数
1
解决办法
6946
查看次数

Android AdView 泄漏,可能是由于某些内部后台线程造成的

我在由片段创建的窗口中显示 AdMob 广告横幅。这有效,但我遇到了奇怪的泄漏问题,我还不明白。当我多次打开和关闭应用程序时,广告片段每次都会被正确销毁,但控制该片段的 MainActivity 正在泄漏:

泄露

有罪的是代码中的这一行:

adRequest = new AdRequest.Builder().addTestDevice(DEVICE_ID_MOTO_G).addTestDevice(DEVICE_ID_ZTE).build();
mAdView.loadAd(adRequest);
Run Code Online (Sandbox Code Playgroud)

(您可以在下面看到我已经尝试使 adRequest 无效,但没有结果。)无论如何,当我注释这两行时,不会发生泄漏。我测试了两次,因为很难相信这个调用会泄漏,但它确实发生了。这是片段代码。正如你所看到的,我什至取消了onDestroy(). 我可以保证这onDestroy()就是所谓的。loadAd启动任何后台线程。我想这与这个问题有关。

public class SnippetFragment extends Fragment
{
    private AdView mAdView;
    private OnAdFinishedLoadingListener onAdFinishedLoadingListener;
    private Context context;
    private AdRequest adRequest;

    private final String DEVICE_ID_ZTE = "1CA20334345BB1479C43692AFA576456487A48";
    private final String DEVICE_ID_MOTO_G = "131465469A7BE11543543065404B168908CB13C8D1";

    public SnippetFragment(Context context)
    {
        this.context = context;
    }

    @Override
    public void onActivityCreated(Bundle bundle)
    {
        super.onActivityCreated(bundle);

        mAdView = (AdView)getView().findViewById(R.id.adView);
        mAdView.setAdListener(new AdListener()
        {
            @Override
            public void onAdLoaded()
            {
                super.onAdLoaded();

                if (context …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks admob android-fragments

2
推荐指数
1
解决办法
1817
查看次数

Java流:按先前的映射结果进行分组和排序?

我必须遵循以下代码:

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

public class TimeZonesExample
{
    public static void main(String[] args)
    {
        Set<String> allZones = ZoneId.getAvailableZoneIds();
        LocalDateTime localDateTime = LocalDateTime.now();

        List<String> zoneList = new ArrayList<>(allZones);

        for (String s : zoneList)
        {
            ZoneId zoneId = ZoneId.of(s);
            ZonedDateTime zoneDateTime = localDateTime.atZone(zoneId);
            ZoneOffset zoneOffset = zoneDateTime.getOffset();
            String out = String.format("%35s %10s%n", zoneId, zoneOffset);

            System.out.printf(out);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这产生了这样一个列表:

                  Asia/Aden     +03:00
             America/Cuiaba     -03:00
                  Etc/GMT+9     -09:00
                  Etc/GMT+8     -08:00
             Africa/Nairobi     +03:00
            America/Marigot     -04:00 …
Run Code Online (Sandbox Code Playgroud)

java lambda java-8 java-stream

2
推荐指数
1
解决办法
337
查看次数

StringBuffer不追加数据-由于线程?

我的目标是从客户端收集数据,该客户端将数据发送到UDP服务器,将数据串联为一个字符串(仅用于测试),然后将整个串联的字符串发送回客户端。UDPClient和UDPServer之间的通信非常完美。我可以发送和接收数据。但是我不知道为什么不能在StringBuffer中连接数据,因为当我尝试这样做时,客户端总是得到我发送过的第一个字符串。而且,无论我要发送到服务器什么,字符串都不会更改。这是服务器类的代码:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class UDPServer extends Thread {

     DatagramSocket serverSocket;
     DatagramPacket receivePacket;
     String sentence;
     InetAddress IPAddress;
     StringBuffer data = new StringBuffer();

    public UDPServer() throws SocketException {
        serverSocket = new DatagramSocket(9876);
    }

    public void run()    {
        while (true)  {
             byte[] receiveData = new byte[1024];
             byte[] sendData = new byte[1024];
             receivePacket = new DatagramPacket(receiveData, receiveData.length);

             try {
                 serverSocket.receive(receivePacket);
            } catch (IOException e) {
                 System.out.println("receive....");
                e.printStackTrace();
            }

             sentence = new String(receivePacket.getData());
             IPAddress = receivePacket.getAddress(); …
Run Code Online (Sandbox Code Playgroud)

java multithreading udp

1
推荐指数
1
解决办法
509
查看次数

为什么正则表达式不匹配没有边界匹配器"行首"?

在Java的正则表达式中有一些我不理解的东西.我有以下字符串(我需要"到日期"):

From Date :01/11/2011 To Date :30/11/2011;;;;;;;;;;;;;
Run Code Online (Sandbox Code Playgroud)

我认为以下正则表达式(在Perl中)会匹配.

to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4})
Run Code Online (Sandbox Code Playgroud)

在Java中,此模式不匹配.但是,如果我在前面和后面添加一个,.+ 那么这样做,所以这个模式适用于Java:

Pattern p = Pattern.compile(".+to\\s+date\\s*?:\\s*?([0-9]{2}[\\./][0-9]{2}[\\./][0-9]{2,4}).+", Pattern.CASE_INSENSITIVE);
Run Code Online (Sandbox Code Playgroud)

我不明白的是:我很清楚,如果我添加一个^(行的开头)和一行$的末尾,第一个模式在Java中是不匹配的.这意味着,模式必须匹配整条线.但是如果没有这个,第一个模式应该实际匹配,因为如果我没有在前面和末尾设置分隔符,为什么模式关心超出此模式范围的字符串数据呢?这对我来说不合逻辑.在我看来,第一个模式的行为类似于String类的"contains"方法.我认为在Perl中也是如此.

java regex pattern-matching

1
推荐指数
1
解决办法
356
查看次数

为什么SQLiteOpenHelper导致IllegalArgumentException数据库无法打开?

首先,这里所有类似的帖子都没有帮助.

在AsyncTask中,我检查应用程序启动是否是第一次启动,这意味着我检查是否有数据库.我希望通过表格查询来做到这一点.这是正在执行的内容:

@Override
public List<Entity> loadAll(Entity markerEntity)
{
    Log.i(TAG, "trying to load all entities of type " + markerEntity.getTable());

    List<Entity> results = new LinkedList<Entity>();

    SQLiteDatabase db = defaultSQLiteOpenHelper.getWritableDatabase();

    Cursor cursor = db.query(markerEntity.getTable(), markerEntity.getAllColumns(), null, null, null, null, null);    
    cursor.moveToFirst();

    while (!cursor.isAfterLast())
    {
        Entity result = markerEntity.createNewInstance(cursor);
        results.add(result);

        cursor.moveToNext();
    }

    db.close();

    return results;
}
Run Code Online (Sandbox Code Playgroud)

IllegalArgumentException崩溃:数据库未打开发生在此行上.

SQLiteDatabase db = defaultSQLiteOpenHelper.getWritableDatabase();
Run Code Online (Sandbox Code Playgroud)

它恰好发生在方法(见下文)createAllTables上.

文件说:

创建和/或打开将用于读写的数据库.第一次调用它时,将打开数据库并调用onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和/或onOpen(SQLiteDatabase).

在我看来,它应该执行我的DefaultSQLiteOpenhelper并创建所有数据库表,但它不会这样做:

public class DefaultSQLiteOpenHelper extends SQLiteOpenHelper implements ISQLiteOpenHelper
{
    private static …
Run Code Online (Sandbox Code Playgroud)

android sqliteopenhelper android-sqlite

1
推荐指数
1
解决办法
1939
查看次数

如何将TableLayout中的按钮对齐到不同的方向?

可能我还不了解TableLayout的布局属性.似乎不可能像HTML那样实现这样灵活的表,因为没有单元格.我的目标是实现这样的布局:

在此输入图像描述

我怎样才能做到这一点?我想过使用GridView,但这似乎在XML中没用.我的努力看起来像这样:

        <TableLayout
        android:id="@+id/tableLayout"
        android:layout_width="320sp"
        android:layout_height="fill_parent"
        android:layout_gravity="center_horizontal"
        android:gravity="bottom"
        android:layout_alignParentBottom="true">
        <TableRow
        android:background="#333333"
        android:gravity="bottom"
        android:layout_width="fill_parent">     
        <Button
            android:id="@+id/btnUp"
            android:layout_width="60sp"
            android:layout_height="50sp"
            android:gravity="left"
            android:text="Lift U"
            />
        <Button
            android:id="@+id/btnScreenUp"
            android:gravity="right"
            android:layout_gravity="right"
            android:layout_width="60sp"
            android:layout_height="50sp"
            android:text="Scrn U"
            />
        </TableRow>
        <TableRow
          android:background="#444444"
          android:gravity="bottom"
          android:layout_gravity="right">
          <Button
            android:id="@+id/btnDown"
            android:layout_width="60sp"
            android:layout_height="50sp"
            android:text="Lift D"
            />
           <Button
            android:id="@+id/btnScreenLeft"
            android:layout_width="60sp"
            android:layout_height="50sp"
            android:gravity="right"
            android:layout_gravity="right"
            android:text="Scrn L"
            />
           <Button
            android:id="@+id/btnScreenDown"
            android:layout_width="60sp"
            android:layout_height="50sp"
            android:gravity="right"
            android:layout_gravity="right"
            android:text="Scrn D"
            />
           <Button
            android:id="@+id/btnScreenRight"
            android:layout_width="60sp"
            android:layout_height="50sp"
            android:gravity="right"
            android:layout_gravity="right"
            android:text="Scrn R"
            />
        </TableRow>
</TableLayout>
Run Code Online (Sandbox Code Playgroud)

android android-layout

0
推荐指数
1
解决办法
1万
查看次数

如何返回我明确作为参数传递的类型?

我想将一个类型存储为参数,但是当我返回它并在JUnit测试中检入时,我会得到类似的东西

Expected: an instance of Java.lang.String
but: <class java.lang.String> is a java.lang.class
Run Code Online (Sandbox Code Playgroud)

这是班级的最小化例子......

public class ContextVariableResult<T> {
    private Class<T> type;

    public ContextVariableResult(Class<T> type) {
        this.type = type;
    }

    //TODO doesn't work
    public Class<T> getType() {
        return type;
    }
}
Run Code Online (Sandbox Code Playgroud)

我传递String.class作为构造函数参数.

我的测试看起来像这样....

assertThat(result.getType(), instanceOf(String.class));
Run Code Online (Sandbox Code Playgroud)

我认为我的hamcrest匹配器是错误的,但由于编译错误,我不能使用is(String.class)isA(String.class):

 The method assertThat(T, Matcher<? super T>) in the type Assert is not applicable for the arguments (Class<capture#3-of ?>, 
     Matcher<String>)
Run Code Online (Sandbox Code Playgroud)

我已经尝试返回反射对象Type,我也尝试转换为ParameterizedType,但后来我得到了ClassCastExceptions等等.

我希望方法结果为"String".我错了什么?如果我不需要传递参数"String.class"会好得多,但我认为我总是会遇到类型擦除问题.

java generics types hamcrest

0
推荐指数
1
解决办法
377
查看次数